美文网首页
31 swift原生约束

31 swift原生约束

作者: rebeccaBull | 来源:发表于2017-04-24 10:07 被阅读0次

    每一个布局约束就是一个明确的线性变化规则,在数学上是以一次函数的形式表示,即:

    y = m * x + c

    其中的firstItem与secondItem分别是界面中受约束的视图与被参照的视图。它们不一定非得是兄弟关系或者父子关系,只要它们有着共同的祖先视图即可,这一点可是autoresizingMask无法做到的。

    firstAttribute与secondAttribute分别是firstItem与secondItem的某个布局属性(NSLayoutAttribute):

    当我们需要为某个视图指定固定宽度或者高度时,这时候secondItem为nil,secondAttribute为NSLayoutAttributeNotAnAttribute。relation定义了布局关系(NSLayoutRelation):

    布局关系不仅限于相等,还可以是大于等于或者小于等于,这种不等关系在处理UILabel、UIImageView等具有自身内容尺寸的控件(自身内容尺寸参见本系列第五篇文章)时非常常用。举个简单的例子,UILabel的长度会随文字的长度而变化,那么我们可以向UILabel控件添加两个约束,分别是“长度大于等于50”与“长度小于等于200”。这样,当文字很少时,宽度也至少为50;当文字非常多时,宽度也不会超过200。

    multiplier即比例系数。constant即常量。

    因此,每个约束就对应如下关系:

    firstItem.firstAttribute {==,<=,>=} secondItem.secondAttribute * multiplier + constant

    //logoImageView左侧与父视图左侧对齐NSLayoutConstraint* leftConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f];//logoImageView右侧与父视图右侧对齐NSLayoutConstraint* rightConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f];//logoImageView顶部与父视图顶部对齐NSLayoutConstraint* topConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f];//logoImageView高度为父视图高度一半NSLayoutConstraint* heightConstraint = [NSLayoutConstraint constraintWithItem:logoImageViewattribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:logoImageView.superviewattribute:NSLayoutAttributeHeight multiplier:0.5f constant:0.0f];//iOS 6.0或者7.0调用addConstraints//[self.view addConstraints:@[leftConstraint, rightConstraint, topConstraint, heightConstraint]];//iOS 8.0以后设置active属性值leftConstraint.active = YES;

    rightConstraint.active = YES;

    topConstraint.active = YES;

    heightConstraint.active = YES;

    将一个已经设置好frame并使用autoresizingMask的视图添加到一个使用自动布局的视图中时,运行时需要隐式地将前者的frame和autoresizingMask转化为自动布局约束(这些隐式转换的约束的类型为NSAutoresizingMaskLayoutConstraint),这样才能明确其位置与尺寸而不会导致约束的缺失。这个隐式转换的过程,是由UIView的translatesAutoresizingMaskIntoConstraints属性的值决定的。默认情况下,为了保证兼容性,该值为YES,表示需要自动进行隐式转换

    ios autolayout中NSLayoutAttributeLeft(Right)与NSLayoutAttributeLeading(Trailing)区别

    在大天朝,这两种效果是一致的

    相关文章

      网友评论

          本文标题:31 swift原生约束

          本文链接:https://www.haomeiwen.com/subject/akbuzttx.html