zoukankan      html  css  js  c++  java
  • Auto Layout: Programmatic Constraints

      继续Auto Layout - BNR篇。

    打开BNRDetailViewController.m文件,重载viewDidLoad方法来创建UIImageView对象。当你想要给通过加载NIB文件创建的视图层级添加约束时,需要重载viewDidLoad方法。如下:

    1 - (void)viewDidLoad {
    2     [super viewDidLoad];
    3     
    4     UIImageView *iv = [[UIImageView alloc] initWithImage:nil];
    5     iv.contentMode = UIViewContentModeScaleAspectFill;
    6     iv.translatesAutoresizingMaskIntoConstraints = NO;
    7     [self.view addSubview:iv];
    8     self.imageVeiw = iv;
    9 }

      每个视图都有一个 translatesAutoresizingMaskIntoConstraints 属性,默认为YES,即iOS会自动创建一些约束来匹配视图自动调整。

      Apple推荐使用Visual Format Language(VFL)来程序化创建约束。


    VFL:一种用字符串常量来描述约束的方式。

       @"H:|-0-[imageView|-0-" ,其中H:指该约束是针对水平位置的。方括号内的imageView指要约束的视图。符号|表示视图的容器。此字符串表示:imageView离其容器左右边缘的距离为0点。同时,可简化为: @"H:|[imageView|" 

       @"V:[dateLabel]-8-[imageView]-8-[tooBar]" ,其指imageView的顶部离dateLabel的距离为8点,imageView的底部离tooBar的距离为8点。可简化为: @"V:[dateLabel]-[imageView]-[tooBar]" 

       @"V:[someView(==50)]" ,指视图的高度约束为50点。


      一个约束即NSLayoutConstraint类的对象,可将其添加到一个视图中。

    修改viewDidLoad方法,创建imageView水平和垂直方向的约束。如下:

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     
     4     UIImageView *iv = [[UIImageView alloc] initWithImage:nil];
     5     iv.contentMode = UIViewContentModeScaleAspectFill;
     6     iv.translatesAutoresizingMaskIntoConstraints = NO;
     7     [self.view addSubview:iv];
     8     self.imageVeiw = iv;
     9     
    10     NSDictionary *nameMap = @{@"imageVeiw":self.imageVeiw, @"dateLabel":self.dateLabel, @"toolBar":self.toolBar};
    11     NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[imageVeiw]-0-|"
    12                                                                              options:0
    13                                                                              metrics:nil
    14                                                                                views:nameMap];
    15     NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[dateLabel]-[imageVeiw]-[toolBar]"
    16                                                                            options:0
    17                                                                            metrics:nil
    18                                                                              views:nameMap];
    19 }

    NSLayoutConstraint的类方法constraintsWithVisualFormat:options:metrics:views的第四个参数为:视觉格式化字符串中的名字与视图层级中的名字的映射。


    添加约束的规则:

    1)如果一个约束影响了两个具有相同父视图的view,则约束应添加到父视图中。

    2)如果一个约束只影响到一个视图,该约束应添加到其所影响的视图中。

    3)如果一个约束影响了两个不具有相同父视图的view,但共享一个ancestor,则该ancestor获得该约束。

    4)如果一个约束影响一个视图和其父视图,则该约束添加到父视图中。

      因此,在viewDidLoad方法中,将创建的约束添加到父视图中,添加如下粗体代码:

    1     NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[dateLabel]-[imageView]-[toolBar]"
    2                                                                            options:0
    3                                                                            metrics:nil
    4                                                                              views:nameMap];
    5     [self.view addConstraints:horizontalConstraints];
    6     [self.view addConstraints:verticalConstraints];

      Intrinsic Content Size:指一个视图的大小基于其要显示的内容。

     contentCompressionResistancePriority 当其值小于1000时,Auto Layout可能压缩视图。

     contentHuggingPriority 当其值小于1000时,Auto Layout可能增加视图的大小。

    viewDidLoad方法添加代码如下:

    1     ......
    2     self.imageVeiw = iv;
    3     
    4     [self.imageVeiw setContentHuggingPriority:200 forAxis:UILayoutConstraintAxisVertical];
    5     [self.imageVeiw setContentCompressionResistancePriority:700 forAxis:UILayoutConstraintAxisVertical];
    6     ......

    创建基于比率的约束时,不能使用VFL,此时需要用到NSLayoutConstraint类的 constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: 类方法。其中multiplier属性是创建基于比率约束的关键。

    1 NSLayoutConstraint *aspectConstraint = [NSLayoutConstraint constraintWithItem:self.imageVeiw
    2                                                                         attribute:NSLayoutAttributeWidth
    3                                                                         relatedBy:NSLayoutRelationEqual
    4                                                                            toItem:self.imageVeiw
    5                                                                         attribute:NSLayoutAttributeHeight
    6                                                                        multiplier:1.5
    7                                                                          constant:0.0];

    添加的约束相当于 imageVeiw.width = 1.5 * imageVeiw.height + 0.0 。


      autoresizing masks:约束一个视图和其父视图的关系,但不会影响同级视图间的关系。默认情况下,会基于autoresizing masks,给视图创建和添加约束。但其经常会与用程序代码添加的约束发生冲突。此时,只需将视图的 translatesAutoresizingMaskIntoConstraints 属性设为NO即可。

  • 相关阅读:
    LeetCode 029 Divide Two Integers
    LeetCode 028 Implement strStr()
    Linux网络技术管理及进程管理
    RAID磁盘阵列及CentOS7系统启动流程
    Linux磁盘管理及LVM讲解(1)
    逻辑卷管理
    Linux磁盘管理及LVM讲解
    Linux计划任务及压缩归档
    Linux权限管理
    用户及用户组管理
  • 原文地址:https://www.cnblogs.com/wjq-Law/p/4913725.html
Copyright © 2011-2022 走看看