首页 > 其他分享 >ios开发之 -- UIView总结

ios开发之 -- UIView总结

时间:2023-08-25 14:02:23浏览次数:48  
标签:-- self ios 视图 animation CGFloat CGRect UIView

如果想调用某个类的某个方法可以写成这样,这个方法来自NSObject类

performSelector:  
performSelector:withObject:  
performSelector:withObject:withObject:

 实际调用

[self performSelector:@selector(displayViews) withObject:nil afterDelay:1.0f];

有三个方法分别是

//父视图   
    [self.view superview]  
    //所有子视图  
     [self.view subviews]  
    //自身的window  
     self.view.window

循环一个视图下面所有视图的方法

NSArray *allSubviews(UIView *aView)  
    {  
        NSArray *results = [aView subviews];  
        for (UIView *eachView in [aView subviews])  
        {  
            NSArray *riz = allSubviews(eachView);  
            if (riz) {  
                results = [results arrayByAddingObjectsFromArray:riz];  
            }  
        }  
        return results;  
    }

循环返回一个APPLICATION里面所有的VIEW

// Return all views throughout the application  
    NSArray *allApplicationViews()  
    {  
        NSArray *results = [[UIApplication sharedApplication] windows];  
        for (UIWindow *window in [[UIApplication sharedApplication] windows])  
        {  
            NSArray *riz = allSubviews(window);  
            if (riz) results = [results arrayByAddingObjectsFromArray: riz];  
        }  
        return results;  
    }

 找出所有的父视图

// Return an array of parent views from the window down to the view  
    NSArray *pathToView(UIView *aView)  
    {  
        NSMutableArray *array = [NSMutableArray arrayWithObject:aView];  
        UIView *view = aView;  
        UIWindow *window = aView.window;  
        while (view != window)  
        {  
            view = [view superview];  
            [array insertObject:view atIndex:0];  
        }  
        return array;  
    }

UIView提供了大量管理视图的方法

//加一个视图到一个视图里面  
    addSubview:  
    //将一个视图移到前面  
    bringSubviewToFront:  
    //将一个视图推送到背后  
    sendSubviewToBack:  
    //把视图移除  
    removeFromSuperview  
    //插入视图 并指定索引  
    insertSubview:atIndex:  
    //插入视图在某个视图之上  
    insertSubview:aboveSubview:  
    //插入视图在某个视图之下  
    insertSubview:belowSubview:  
    //交换两个位置索引的视图  
    exchangeSubviewAtIndex:withSubviewAtIndex:

视图回调

//当加入视图完成后调用  
    (void)didAddSubview:(UIView *)subview  
    //当视图移动完成后调用  
    (void)didMoveToSuperview  
    //当视图移动到新的WINDOW后调用  
    (void)didMoveToWindow  
    //在删除视图之后调用  
    (void)willRemoveSubview:(UIView *)subview  
    //当移动视图之前调用  
    (void)didMoveToSuperview:(UIView *)subview  
    //当视图移动到WINDOW之前调用  
    (void)didMoveToWindow

给UIView设置标记和检索视图

myview.tag = 1001;  
    [self.view viewWithTag:1001];  
    (UILable *)[self.view.window viewWithTag:1001];

视图的几何特征

//框架  
struct CGPoint {  
  CGFloat x;  
  CGFloat y;  
};  
typedef struct CGPoint CGPoint;  
  
/* Sizes. */  
  
struct CGSize {  
  CGFloat width;  
  CGFloat height;  
};  
typedef struct CGSize CGSize;  
  
struct CGRect {  
  CGPoint origin;  
  CGSize size;  
};  
typedef struct CGRect CGRect;  
  
  
  
CGRect rect = CGRectMake(0,0,320,480);  
UIView *view = [[UIView allow]initWithFrame:rect];  
  
//将String转成CGPoint 如 @”{3.0,2.5}”    {x,y}  
CGPoint CGPointFromString (  
   NSString *string  
);  
  
//将String转成CGRect  @”{{3,2},{4,5}}”  {{x,y},{w, h}}  
CGRect CGRectFromString (  
   NSString *string  
);  
  
//将String转成CGSize @”{3.0,2.5}” {w, h}  
CGSize CGSizeFromString (  
   NSString *string  
);  
  
//CGPoint转成NSString  
NSString * NSStringFromCGPoint (  
   CGPoint point  
);  
  
//CGRect转成NSString  
NSString * NSStringFromCGRect (  
   CGRect rect  
);  
  
//CGSize转成NSString  
NSString * NSStringFromCGSize (  
   CGSize size  
);  
  
//对一个CGRect进行修改 以这个的中心来修改 正数表示更小(缩小) 负数表示更大(放大)  
CGRect CGRectInset (  
   CGRect rect,  
   CGFloat dx,  
   CGFloat dy  
);  
  
//判断两个矩形是否相交  
bool CGRectIntersectsRect (  
   CGRect rect1,  
   CGRect rect2  
);  
  
//初始为0的  
const CGPoint CGPointZero;  
const CGRect CGRectZero;  
const CGSize CGSizeZero;  
  
//创建CGPoint  
CGPoint CGPointMake (  
   CGFloat x,  
   CGFloat y  
);  
//创建CGRect  
CGRect CGRectMake (  
   CGFloat x,  
   CGFloat y,  
   CGFloat width,  
   CGFloat height  
);  
//创建CGSize  
CGSize CGSizeMake (  
   CGFloat width,  
   CGFloat height  
);

仿射变换

CGAffineTransform form = CGAffineTransformMakeRotation(PI);  
myview.transform = form;

如想复原

myview.transform = CGAffineTransformIdentity;

 直接设置视图的中心

myview.center = CGPointMake(100,200);

 中心

CGRectGetMinX  
CGRectGetMinY  
//X的中间值  
CGRectGetMidX  
//Y的中间值  
CGRectGetMidY  
CGRectGetMaxX  
CGRectGetMaxY

定时器

NSTime *timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(move:) userInfo:nil repeats:YES];

定义视图边界

typedef struct UIEdgeInsets {  
        CGFloat top, left, bottom, right;  // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'  
    } UIEdgeInsets;  
    //eg  
    UIEdgeInsets insets = UIEdgeInsetsMake(5, 5, 5, 5);  
    CGRect innerRect = UIEdgeInsetsInsetRect([aView bounds], insets);  
    CGRect subRect = CGRectInset(innerRect, self.frame.size.width / 2.0f, self.frame.size.height / 2.0f);

仿射变换补充

//创建CGAffineTransform

//angle 在0-2*PI之间比较好  旋转  
    CGAffineTransform transform = CGAffineTransformMakeRotation(angle);  
    //缩放   
    CGAffineTransform transform = CGAffineTransformMakeScale(0.5f,0.5f);  
    //改变位置的  
    CGAffineTransform transform = CGAffineTransformMakeTranslation(50,60);  
      
    //修改CGAffineTransform  
    //修改 缩放   
    CGAffineTransform scaled = CGAffineTransformScale(transform, degree, degree);  
    //修改 位置  
    CGAffineTransform transform = CGAffineTransformTranslate(  
       CGAffineTransform t,  
       CGFloat tx,  
       CGFloat ty  
    );  
      
    //修改角度   
    CGAffineTransform transform = CGAffineTransformRotate (  
       CGAffineTransform t,  
       CGFloat angle  
    );  
    //最后设置到VIEW  
     [self.view setTransform:scaled];

建立UIView动画块

   //首先建立CGContextRef

CGContextRef context = UIGraphicsGetCurrentContext();  
//标记动画开始  
[UIView beginAnimations:nil context:context];  
//定义动画加速或减速的方式  
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];  
//定义动画的时长 1秒  
[UIView setAnimationDuration:1.0];  
//中间处理 位置变化,大小变化,旋转,等等的  
[[self.view viewWithTag:999] setAlpha:1.0f];  
//标志动画块结束  
[UIView commitAnimations];  
//还可以设置回调  
[UIView setAnimationDelegate:self];  
//设置回调调用的方法  
[UIView setAnimationDidStopSelector:@selector(animationFinished:)];

视图翻转

UIView *whiteBackdrop = [self.view viewWithTag:100];  
    // Choose left or right flip 选择左或右翻转  
    if ([(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex]){  
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:whiteBackdrop cache:YES];  
    }else{  
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:whiteBackdrop cache:YES];  
    }  
        NSInteger purple = [[whiteBackdrop subviews] indexOfObject:[whiteBackdrop viewWithTag:999]];  
        NSInteger maroon = [[whiteBackdrop subviews] indexOfObject:[whiteBackdrop viewWithTag:998]];  
    //交换视图  
        [whiteBackdrop exchangeSubviewAtIndex:purple withSubviewAtIndex:maroon];  
      
    //还有上翻和下翻两种 如下  
    typedef enum {  
    //没有任何效果  
        UIViewAnimationTransitionNone,  
        UIViewAnimationTransitionFlipFromLeft,  
        UIViewAnimationTransitionFlipFromRight,  
        UIViewAnimationTransitionCurlUp,  
        UIViewAnimationTransitionCurlDown,  
    } UIViewAnimationTransition;

使用QuartzCore做动画

//创建CATransition  
CATransition *animation = [CATransition animation];  
//设置代理  
animation.delegate = self;  
//设置动画过渡的时间  
animation.duration = 4.0f;  
//定义动画加速或减速的方式   
animation.timingFunction = UIViewAnimationCurveEaseInOut;  
//animation.type 表示设置过渡的种类 如 Fade,MoveIn,Push,Reveal  
switch ([(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex]) {  
        case 0:  
            animation.type = kCATransitionFade;  
            break;  
        case 1:  
            animation.type = kCATransitionMoveIn;  
            break;  
        case 2:  
            animation.type = kCATransitionPush;  
            break;  
        case 3:  
            animation.type = kCATransitionReveal;  
        default:  
            break;  
    }  
//设置渐变的方向,上下左右  
    if (isLeft)  
        animation.subtype = kCATransitionFromRight;  
    else  
        animation.subtype = kCATransitionFromLeft;  
  
// Perform the animation  
    UIView *whitebg = [self.view viewWithTag:10];  
    NSInteger purple = [[whitebg subviews] indexOfObject:[whitebg viewWithTag:99]];  
    NSInteger white = [[whitebg subviews] indexOfObject:[whitebg viewWithTag:100]];  
    [whitebg exchangeSubviewAtIndex:purple withSubviewAtIndex:white];  
    [[whitebg layer] addAnimation:animation forKey:@"animation"];

animation.type还可以用以下的赋值

 

switch (theButton.tag) {    
        case 0:    
            animation.type = @"cube";    
            break;    
        case 1:    
            animation.type = @"suckEffect";    
            break;    
        case 2:    
            animation.type = @"oglFlip";    
            break;    
        case 3:    
            animation.type = @"rippleEffect";    
            break;    
        case 4:    
            animation.type = @"pageCurl";    
            break;    
        case 5:    
            animation.type = @"pageUnCurl";    
            break;    
        case 6:    
            animation.type = @"cameraIrisHollowOpen ";    
            break;    
        case 7:    
            animation.type = @"cameraIrisHollowClose ";    
            break;    
        default:    
            break;    
    }

 

 

休眠一下

[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]];

一个简单的通过图片做的动画

// Load butterfly images  
    NSMutableArray *bflies = [NSMutableArray array];  
    for (int i = 1; i <= 17; i++){  
        [bflies addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"bf_%d", i] ofType:@"png"]]];  
    }  
    UIImageView *butterflyView = [[UIImageView alloc] initWithFrame:CGRectMake(40.0f, 300.0f, 60.0f, 60.0f)];  
    butterflyView.tag = 300;  
           //设置动画的图片  
    butterflyView.animationImages = bflies;  
           //设置时间  
    butterflyView.animationDuration = 0.75f;  
    [self.view addSubview:butterflyView];  
           //开始动画  
    [butterflyView startAnimating];  
    [butterflyView release];

 

 

 


作者:稻草人11223

标签:--,self,ios,视图,animation,CGFloat,CGRect,UIView
From: https://blog.51cto.com/u_13188203/7230163

相关文章

  • ios 开发之 -- UILabel的text竖行显示
    让UILabel的内容竖行显示,我经常用一下两种方式:第一种:使用换行符\nlabel.text=@"请\n竖\n直\n方\n向\n排\n列";label.numberOfLines=[label.textlength];第二种:使用lineBreakMode属性label.text=@"请竖行显示";label.lineBreakMode=NSLineBreakByWordWrapping;//换行模......
  • iOS开发之--搭建本地的SVN服务器
    近期入职的新公司,后台没有分配svn账号,需要在本地搭建一个服务器,方便和代码,看了看网上的教程,一直有这样那样的问题,其中最主要的问题还是路径拼接的问题,最后终于解决了,特在此分享下,如果大家有更快捷的方法可以交流下:步骤如下:1,首先在任意地方建立一个文件夹,如在桌面上建立一个名字为sv......
  • ios开发之 -- 单例类
    单例模式是一种软件设计模式,再它的核心结构中指包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个势力而且该势力易于外界访问,从而方便对势力个数的控制并节约系统资源。如果希望在系统中某各类的对象只能存在一个,单例模式是最好的解决方案。单例模式目前用......
  • ios开发之 -- invalid nib registered for identifier
    今天在写代码的时候,碰到这麽一个问题:invalidnibregisteredforidentifier(重用符)-nibmustcontainexactlyonetoplevelobjectwhichmustbeaUITableViewCellinstance'我一直以为是注册那边出了问题,改了2遍,还是没好,后来百度了下,原因如下:通过xib创建cell的时候一定......
  • Robot 框架学习笔记
    Robot框架学习笔记为了更好地让读者理解快速学习新框架的思路,笔者接下来会继续介绍另一个名为Robot的自动化测试框架,希望读者能参考笔者从零开始讲解一个开发/测试框架的流程,从中总结出适合于自己的快速学习方法。与Selenium框架相比,Robot框架是一款更为通用的、可扩展的......
  • swift - 之TabBarController的用法
    TabBarController的使用,下面记录两种写法,代码如下:TabBarItem系统自带图标样式(System)介绍:Custom:自定义方式,配合SelectedImage来自定义图标More:三个点的图标,表示更多意思Favorites:星形图标Featured:星形图标TopTated:星形图标Recents:时钟图标Contacts:一个圆形一个人头像的图标,代表联......
  • DNSLOG平台搭建及其原理分析
    一、DNS基本概念0x1:DNS中不同域名类型概念DNS的全称是DomainNameSystem(网络名称系统),它作为将域名和IP地址相互映射,使人更方便地访问互联网。当用户输入某一网址如littlehann.com,网络上的DNSServer会将该域名解析,并找到对应的真实IP如101.37.97.51,使用户可以访问这台服务器上......
  • git使用
    第一步:下载Git首先,需要从官方网站https://git-scm.com/downloads下载Git的安装包。网站会根据你使用的操作系统自动推荐对应的版本。第二步:安装Git安装包下载完成后,双击打开,按照指导操作即可完成安装过程。对于Windows平台,可能需要在安装过程中选择一些组件,如图形界面和命令行......
  • Java反射是什么?
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造......
  • Nacos-环境隔离
               ......