首页 > 代码库 > 0821基础控件-作业(UIView常用属性)

0821基础控件-作业(UIView常用属性)

一、UIView的常用属性1——父子视图属性

1、 superview

获得自己的父控件对象

2、subviews

获得自己的所有子控件对象

注意:

–一个视图最多只能有一个父视图

–一个视图可以有多个子视图

代码段1.1:

// 系统加载完Storyboard之后,会自动执行
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 如果这句话没有执行,一定是StoryBoard出了问题
    NSLog(@"View Did Load");
    
    // SuperView
    UIView *superView = self.view.superview;
    // NSLog可以使用%@ Log所有的“对象”,就是在定义的时候,使用了*这个标记
    // ViewController会自动有一个UIView,这个是RootView,根视图没有superview
    NSLog(@"%@", superView);
    
    NSArray *subviews = [self.view subviews];
    NSLog(@"子视图数量 %d", [subviews count]);
    
    for (UIView *view in self.view.subviews) {
        NSLog(@"%@", view);
    }
    
    // 看子视图的子视图
    UIView *sView = _subView1.superview;
    NSLog(@"子视图的父视图 %@", sView);
    
    NSArray *subViews1 = [_subView1 subviews];
    for (UIView *view in subViews1) {
        NSLog(@"黄色视图的子视图是 %@", view);
    }
}

 

二、UIView的常用属性2——位置尺寸属性

1、frame

控件所在矩形框的位置和尺寸(以父控件的左上角为坐标原点)

2、bounds

控件所在矩形框的位置和尺寸(以自己左上角为坐标原点,所以bounds的x和y永远为0)

3、center

控件中点的位置(以父控件的左上角为坐标原点),通过center属性设置视图位置更加方便

注意

–用frame和center可以修改UIView的位置

–用frame和bounds可以修改UIView的尺寸

–通常:修改自身位置大小时使用frame,而子视图(控件)在设置位置时,会相对父视图的bounds进行设置

image

代码段2.1:

// 查看边框
- (IBAction)viewViewFrame:(id)sender
{
    // 需要用到一个Fundation的函数,讲一个矩形定义转换成字符串
    NSLog(@"frame:  %@", NSStringFromCGRect(_subView1.frame));
}

// 查看边界
- (IBAction)viewViewBounds:(id)sender
{
    NSLog(@"bounds:  %@", NSStringFromCGRect(_subView1.bounds));
}

// 查看中心点
- (IBAction)viewViewCenter:(id)sender
{
    NSLog(@"center: %@", NSStringFromCGPoint(_subView1.center));
}

 

代码段2.2:

#pragma mark - 查看视图属性
- (IBAction)viewProperties:(UIButton *)sender
{
    NSLog(@"%d", sender.tag);
    switch (sender.tag) {
        case 0:
            NSLog(@"frame:  %@", NSStringFromCGRect(_subView1.frame));
            break;
        case 1:
            NSLog(@"bounds:  %@", NSStringFromCGRect(_subView1.bounds));
            break;
        case 2:
            NSLog(@"center:  %@", NSStringFromCGPoint(_subView1.center));
            break;
            
        default:
            break;
    }
}

注:可以通过Xcode可视化界面或者setTag方法来设置按钮的tag属性;

 

代码段2.3:

// 旋转视图
- (IBAction)rotationView:(id)sender
{
    // 旋转角度的参数是弧度值,弧度制是一个浮点数,180度的角度对应的弧度值是PI , 90 = PI / 2, 45 = PI / 4
    // 使用TransformMakexxx方法是相对视图初始位置的形变
    CGAffineTransform transform = CGAffineTransformRotate(_subView1.transform, M_PI_4);
    
    [_subView1 setTransform:transform];
}

// 缩放视图
- (IBAction)scaleView:(id)sender
{
    // 点一下,放大,tag = 1
    // 再点一下,缩小 tag = 0
    
    // sx表示水平方向缩放的比例
    // sy表示垂直方向缩放的比例
    CGAffineTransform transform;
    
    if (_subView1.tag == 0) {
        transform = CGAffineTransformScale(_subView1.transform, 1.2, 1.5);
        [_subView1 setTag:1];
    } else {
        // 缩小的时候,需要注意比例的处理
        transform = CGAffineTransformScale(_subView1.transform, 1.0 / 1.2, 1.0 / 1.5);
        [_subView1 setTag:0];
    }

    [_subView1 setTransform:transform];
}

// 平移视图
- (IBAction)translationView:(id)sender
{
    CGAffineTransform transform;
    
    // 如果tag == 0,向下移动300个点
    // 如果tag == 1,回复初始位置
    if (_subView1.tag == 0) {
        
        transform = CGAffineTransformMakeTranslation(10.0, 300.0);
        [_subView1 setTag:1];
    } else {
        transform = CGAffineTransformMakeTranslation(0, 0);
        [_subView1 setTag:0];
    }
    
    [_subView1 setTransform:transform];
}

 

代码段2.4:

// 形变操作
- (IBAction)transformAction:(UIButton *)sender
{
    CGAffineTransform transform;
    
    // 根据按钮的tag,来决定对子视图做什么形变操作
    switch (sender.tag) {
        case 0:             // 旋转
            transform = CGAffineTransformRotate(_subView1.transform, M_PI_4);
            
            break;
        case 1:             // 缩放
            if (_subView1.tag == 0) {
                transform = CGAffineTransformScale(_subView1.transform, 1.2, 1.5);
                [_subView1 setTag:1];
            } else {
                // 缩小的时候,需要注意比例的处理
                transform = CGAffineTransformScale(_subView1.transform, 1.0 / 1.2, 1.0 / 1.5);
                [_subView1 setTag:0];
            }
            
            break;
        case 2:             // 平移
            if (_subView1.tag == 0) {
                
                transform = CGAffineTransformMakeTranslation(10.0, 300.0);
                [_subView1 setTag:1];
            } else {
                transform = CGAffineTransformMakeTranslation(0, 0);
                [_subView1 setTag:0];
            }
            break;
            
        default:
            break;
    }

 

三、UIView的常用属性3——标记属性

1、tag整数,控件的ID(标记),父控件可以通过tag来找到或区分子控件,可以通过以下方法设置tag属性:

[self.button setTag:0];

可以再程序代码中动态地更新tag属性值,以达到不同的按钮操作效果。

 

四、UIView的常用属性4——形变属性

1、transform

控件的形变属性(可以设置旋转角度、比例缩放、平移等属性)

注意:

–UIView一次只能应用一个形变属性

–设置transfrom会改变UIView的frame属性,但不会改变bounds属性

–CGAffineTransformMakeScale相对UIView的初始状态进行形变

–CGAffineTransformScale相对UIView的当前状态进行形变

五、UIView封装的简单动画效果

[UIView beginAnimations:nil context:nil];
// 设置动画持续时间
[UIView setAnimationDuration:.3];
// 需要动画的代码段
[UIView commitAnimations];

代码5.1:

// 定义动画效果
//    [UIView beginAnimations:nil context:nil];
//    // 默认动画时间长度是0.2秒
//    [UIView setAnimationDuration:3.0f];
  
    [UIView animateWithDuration:2.0f animations:^{
        // 设置子视图的形变属性
        [_subView1 setTransform:transform];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:1.0f animations:^{
            // 设置视图背景颜色
            [_subView1 setBackgroundColor:[UIColor redColor]];
            // 设置视图透明度
            [_subView1 setAlpha:0.1f];
        }];
        NSLog(@"动画完成");
    }];
    
    // 提交动画效果
//    [UIView commitAnimations];
    
    NSLog(@"动画提交");
}

 

六、UIView封装了三个块动画方法

1、[UIView animateWithDuration:animations:]

2、[UIView animateWithDuration:animations:completion:]

3、[UIView animateWithDuration: delay: options: animations: completion:]

注意:

对比beginAnimations动画的方式,块动画具有以下几点优势:

1、可以在动画完成时做一些其他的任务

2、可以设置动画延迟及动画效果选项

3、块动画支持嵌套