UIView是UIKit框架里面最基础的视图类,是UIResponder的子类,是UIApplication和UIViewController的兄弟类,是UIWindow,UILabel,UIImageView,UIScrollView,UIControl等的父类,是UIButton,UITextField的父父类(它们是UIControl的子类),是UITableView,UICollectionView的父父类(它们是UIScrollView的子类)。在UIKit框架中掌握各个视图之间的继承关系是很重要的,比如知道了UILabel的父类是UIView,那么UIView的很多属性和方法UILabel继承过去就可以直接用。同样的,UIView继承于UIResponder,了解UIResponder的属性和方法同样是有必要的,会在UIResponder的总结中写出来。
因为UIView是很多常用视图控件的父类,它的属性和方法可以被直接继承到子类。所以,了解UIView的常用属性和方法就显得尤为重要,这里做一个简单的总结,一些细节异同点注意点后续会继续完善。
根据官方文档,UIView根据不同的用途可以分为7大常用模块(当然不止这些),分别是基础配置,几何学配置,层级关系,渲染,动画,手势,约束。
0:准备工作
首先添加两个UIView的属性
1 @property (nonatomic, strong) UIView * view1;2 @property (nonatomic, strong) UIView * view2;
1:基础配置
基础配置主要包括实例化,用户交互,tag值。
注意:
1:用户交互:UIView的用户交互是默认打开的,它的子类中UILabel和UIimageView的用户交互默认是关闭的(因为这两个偏重展示文字或者图片),所以其他继承于UIView的子类,用户交互默认是打开的,但是上面两个是关闭的,如果需要使用交互,需要把它们的用户交互打开(如在图片上添加手势)。
2:tag值:一般来说,我们自己创建的tag值要写的大一点并且有规律一些,因为小的tag值可能和系统定义的冲突,有规律方便使用。
1 /** 2 * 1:基础配置 3 */ 4 - (void)basisConfig 5 { 6 //1:常用的两种实例化方式 7 self.view1 = [[UIView alloc] init]; 8 self.view2 = [[UIView alloc] initWithFrame:CGRectMake(100, 300, 200, 100)]; 9 //2:基础属性10 self.view1.userInteractionEnabled = YES;//用户交互,默认是打开的11 self.view2.userInteractionEnabled = NO;12 //3:tag值13 self.view1.tag = 1001;14 self.view2.tag = 1002;15 }
2:几何学配置
几何学主要包括frame,bounds,center,transform四种
注意:
1:frame,bounds,center的区别和关系:frame是相对于父视图来说的,包括坐标和尺寸。bounds是相对于本身来说的,坐标是(0,0),center就是视图的中心点坐标。
2:transform两种写法的区别:make那种写法是相对于初始视图的,就是不管后面做什么样的变换,这个变换都是相对于初始视图进行变换的,所以有可能出现后面的变换把前面的覆盖掉。另一种写法就是相对于上一种变换的,所以可以实现连续变换。
1 /** 2 * 2:几何学配置 3 */ 4 - (void)geometryConfig 5 { 6 //1:frame 7 self.view1.frame = CGRectMake(100, 100, 200, 100); 8 //2:bounds 9 self.view1.bounds = CGRectMake(0, 0, 200, 100);10 self.view2.bounds = CGRectMake(0, 0, 200, 100);11 //3:center12 self.view1.center = CGPointMake(self.view.center.x, self.view.center.y);13 self.view2.center = self.view.center;//和上面效果相同14 //4:transform15 self.view1.transform = CGAffineTransformMakeRotation(0.1);//旋转16 self.view2.transform = CGAffineTransformRotate(self.view2.transform, 0.7);//旋转17 self.view1.transform = CGAffineTransformMakeTranslation(50, 50);//平移18 self.view2.transform = CGAffineTransformTranslate(self.view2.transform, -100, 100);//平移19 self.view1.transform = CGAffineTransformMakeScale(0.5, 0.5);//比例缩放20 self.view2.transform = CGAffineTransformScale(self.view2.transform, 0.5, 0.5);//比例缩放 21 }
3:层级关系
层级关系主要包括视图之间各种层级关系以及对视图之间层级关系的操作。方法很灵活,几乎可以实现任何层视图的切换,添加,删除,插入,放到最上面,放到最下面,交换等。
1 /** 2 * 3:层级关系 3 */ 4 - (void)hierarchyConfig 5 { 6 //1:添加到父视图 7 [self.view addSubview:self.view1];//视图来的时候父视图把你带来 8 [self.view addSubview:self.view2]; 9 //父视图管理子视图的思想,其实父视图上面应该有个子视图数组,来管理在它上面所有的子视图10 UIView * view3 = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];11 view3.backgroundColor = [UIColor orangeColor];12 //2:三种插入方式13 [self.view insertSubview:view3 aboveSubview:self.view1];14 [self.view insertSubview:view3 belowSubview:self.view2];15 [self.view insertSubview:view3 atIndex:0];16 //3:bring send17 [self.view bringSubviewToFront:self.view1];18 [self.view sendSubviewToBack:self.view2];//父视图来操作,把它放到兄弟视图的最下面19 //4:交换20 [self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];//按顺序交换视图21 //5:移除22 [view3 removeFromSuperview];//走的时候自己走,来的时候父视图把你带来23 //6:两个属性24 NSLog(@"----%@----%@",self.view.subviews, self.view1.superview);25 26 }
4:渲染
渲染主要是常用的背景颜色,切边界,透明度,显示隐藏
注意:
切边界:切边界是父视图做的事情,父视图来切子视图,这也体现了父视图管理子视图的核心思想。
隐藏属性:实际开发中,隐藏属性可以帮助我们通过捷径修改一些展示效果,很多时候不需要删除,隐藏就行了。
1 /** 2 * 4:渲染 3 */ 4 - (void)renderingConfig 5 { 6 //1:背景颜色 7 self.view1.backgroundColor = [UIColor orangeColor]; 8 //2:切边界 9 UIView * view4 = [[UIView alloc] initWithFrame:CGRectMake(10, 0, 50, 200)];10 view4.backgroundColor = [UIColor blueColor];11 [self.view1 addSubview:view4];12 self.view1.clipsToBounds = YES;//父视图做的事情,让子视图切到自己的边界13 //3:透明度14 view4.alpha = 0.3;//View自带,不用Image15 //4:显示隐藏16 view4.hidden = YES;//视图的隐藏属性17 18 }
5:动画
UIView中封装了一些动画属性,可以让我们在不实用Core Animation的情况下就能实现很多动画效果。实现方式也是多种多样,iOS7以后甚至封装了关键帧动画,可见,在开发中,如果对动画效果没有很高的要求,UIView自带的动画效果是足够用的。这里简单的实现一下用block方式实现的基础动画。
注意:
动画改变的是什么?是视图的属性,比如frame,backgroundColor,alpha等,而且动画效果一般都是类方法,直接用UIView调用,把需要改变的属性末状态写在block块中即可。
1 /** 2 * 5:动画 3 */ 4 - (void)animationBlockConfig 5 { 6 //第一种 7 [UIView animateWithDuration:5 animations:^{ 8 self.view1.alpha = 0.1; 9 }];10 //第二种11 [UIView animateWithDuration:5 animations:^{12 self.view2.alpha = 0.1;13 } completion:^(BOOL finished) {14 self.view2.alpha = 1.0;15 }];16 //第三种17 [UIView animateWithDuration:5 delay:6 options:UIViewAnimationOptionBeginFromCurrentState animations:^{18 self.view2.frame = CGRectMake(0, 0, 100, 100);19 20 } completion:nil];21 22 }
6:手势
手势主要包括添加手势和移除手势。
1 /** 2 * 6:手势 3 */ 4 - (void)gestureRecognizersConfig 5 { 6 UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] init]; 7 //添加手势 8 [self.view1 addGestureRecognizer:tap]; 9 //移除手势10 [self.view1 removeGestureRecognizer:tap];11 12 }
7:约束
约束在开发中也是很重要的,添加约束的方式也有很多种,通过系统封装好的类,xib拖线,第三方库,VFL语言等等很多方式,这里就是View本身添加约束和删除约束两个基本方法
1 /** 2 * 7:约束 3 */ 4 - (void)constraintConfig 5 { 6 NSLayoutConstraint * constraint = [[NSLayoutConstraint alloc] init]; 7 //添加约束 8 [self.view1 addConstraint:constraint]; 9 //添加约束组10 [self.view1 addConstraints:@[constraint]];11 //删除约束12 [self.view1 removeConstraint:constraint];13 //删除约束组14 [self.view1 removeConstraints:@[constraint]];15 16 }