UIView的使用

UIView 原理
1.它是一个iOS开发中非常重要的类。
UILabel,UIButton,UIImageView父类或间接父类都是UIView,换句话说只要是界面上能看到的东西都是UIView

2.坐标系的属性和方法

@property(nonatomic) CGRect frame; 
 @property(nonatomic) CGRect bounds; 
 @property(nonatomic) CGPoint center; 
 @property(nonatomic) CGAffineTransform transform; 
 //另:frame bounds center三个属性相互关联,改变其中一个,另两个也会改变。

3.属性: 位置和大小, 背景颜色
方法: 显示和隐藏
把所有的控件的共同的属性和行为抽取出来, 形成了UIView视图类。
(1)位置frame
(2)背景颜色backgroundColor
(3)透明度alpha
(4)中心位置center
(5)设置大小bounds
(6)tag标签
(7)是否交互userInteractionEnabled

//是否与用户交互 默认YES 
 view.userInteractionEnabled = YES; 
 //UILabel UIImageView 默认交互是NO 
 //UIButton 默认交互是YES 
 (8)是否隐藏 
 //是否隐藏 默认是NO 如果是YES 相当于alpha = 0 隐藏后按钮不能被点击 
 view.hidden = NO;

4.视图层次感
【注】任何视图,都可以添加到另一个视图上面,但是每个视图只能有一个父视图。也就是说一个子视图被添加到另一个视图上,会从原父视图上脱离。
【注】子视图的坐标是相对于父视图的。以父视图左上角一点为原点。移动父视图,因为子视图的位置是相对的,所以会一起移动。

1.把view放在最上面bringSubviewToFront 
 2.把view放在最下面sendSubviewToBack 
 3.获取一个父视图superview(仅有一个) 
 //superview 拿到某视图的父试图 
 UIView *superView = redView.superview; 
 4.获取子视图数组(可以有多个) 
 //subviews拿到某视图所有的子视图 
 NSArray *arr = self.view.subviews; 
 5.销毁一个视图(removeFromSuperview) 
 6.子视图插入insertSubview 
 7.交换两个子视图(exchangeSubviewAtIndex) 
 //父试图可以改变子试图的层级关系 
 //把子试图放到最前面(上面) 
 [self.view bringSubviewToFront:redView];
//把子试图放到最后面(下面)
[self.view sendSubviewToBack:greenView];

//把某个子试图放到另一个子试图的上面
[self.view insertSubview:greenView aboveSubview:redView];
//把某个子试图放到另一个子试图的下面
[self.view insertSubview:greenView belowSubview:redView];

//把某个试图放到指定位置上
[self.view insertSubview:blueView atIndex:4];

//先添加的在最前面  数组元素的顺序是子视图显示的顺序
NSLog(@"%@",arr);

for (UIView * view in self.view.subviews) {
    if ([view isKindOfClass:[UIView class]]) {
        NSLog(@"是UIView");
    }else if ([view isKindOfClass:[UIButton class]]){
        NSLog(@"是按钮");
    }
}

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 40, 10)];
label.text = @"label";
//任何视图都可以添加到任何试图上
[redView addSubview:label];

//把某视图从父视图移除 子试图调用这个方法 父试图不能主动移除子视图
[redView removeFromSuperview];
//如果这个试图移除了 它的子试图会一起移除

5.UIView动画

/————–非Block动画制作——————–/ 
 /* 
 //UIView动画,由类方法驱动 
 //从这里开始是动画的结果 
 [UIView beginAnimations:nil context:nil]; 
 //设置延迟时间 
 [UIView setAnimationDelay:15]; 
 //设置代理 
 [UIView setAnimationDelegate:self]; 
 //设置代理回调的方法 
 [UIView setAnimationDidStopSelector:@selector(completed)]; 
 //动画结束后,self要调用completed
//设置动画执行时间
[UIView setAnimationDuration:5];

//动画可以修改任何UIView子类的坐标,大小,形变,色彩和透明度
view.frame = self.window.bounds;
view.backgroundColor = [UIColor greenColor];

[UIView commitAnimations];
//完成动画结果的设置,开始执行动画

*/

/*-------------Block版本的动画效果------------------*/

void (^animations)(void) = ^(void){
    view.frame = self.window.bounds;
    view.backgroundColor = [UIColor blueColor];
};

void (^completion)(BOOL) = ^(BOOL finished){
    NSLog(@"动画结束!");
};

[UIView animateWithDuration:5 delay:15 options: UIViewAnimationOptionLayoutSubviews animations:animations completion:completion];

6.停靠模式
【注】停靠模式,是控制父视图改变大小时,子视图的变化方式。
【注】停靠模式并非服务于视图缩放,使用transform属性scale视图,根本是等比缩放。停靠模式是服务于父视图边界修改后,子视图的布局。
//自动改变子试图的大小 默认是NO 设置成YES子试图会跟着父试图改变大小
view.autoresizesSubviews = YES;

//子试图的停靠模式
subView.autoresizingMask = UIViewAutoresizingFlexibleHeight |UIViewAutoresizingFlexibleWidth;
// ‘|’ 位运算符
//    UIViewAutoresizingNone                 = 0,
//    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
//  右边界和父视图的距离不变 左边界自由
//    UIViewAutoresizingFlexibleWidth        = 1 << 1,
//  自由的宽度
//    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
//  左边界和父视图的距离不变 右边界自由
//    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
//  下边界和父视图的距离不变 上边界自由
//    UIViewAutoresizingFlexibleHeight       = 1 << 4,
//  自由的高度
//    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
//  上边界和父视图的距离不变 下边界自由