zoukankan      html  css  js  c++  java
  • iOS 自动布局详细介绍

    1. 自动布局的理解

    iOS自动布局很有用,可以在不同size的屏幕上运行,原先看的头痛,还是习惯用最蠢的[UIScreen mainScreen].bounds.size.width等来布局,后来实在不行了,开始好好地看自动布局,发现理解后真的很好用,现在就来分享分享我的心得吧。

    首先要明白一个控件在屏幕上的位置怎么样才能真正地确定。最简单的情况是:

    1. 例如一个矩形,只要知道它左上角点的坐标,宽,高,那么位置就固定了。

    2. 例如一个圆,只要知道它的圆心坐标,半径,那么位置就固定了。

    自动布局就是这个意思,它可以理解为活的布局,因为确定一个控件的位置有很多方法,死死地确定位置,那么屏幕size变了,可能位置就不是我们想要的。

    所以做自动布局的时候,需要思考的就是屏幕变的情况下,我设定的约束条件还能使它在我想要的位置,那么这些约束条件就是好的。

    举个最简单的例子。让一个矩形在屏幕正中。

    设定它的左上角坐标,宽,高。那么屏幕变了位置肯定变了。

    设定它的中心为屏幕的中心,宽,高,那么屏幕size变了,它肯定还在中心,这就是好的约束。

    所以我的理解就是,自动布局的核心就在于,设定好的约束,让屏幕的size变化时,它所在的位置仍然是我们想要的

    2. 自动布局的实现

    自动布局的实现只有两种。

    1. storyboard 

    2. 纯代码控制

    在storyboard上设定约束条件很容易,按住Ctrl拖动就可以了。如果你设定的约束条件不足或者冲突,那么会有红色的提示;如果你设定的约束条件和你控件所在的位置有误差,那么会有黄色的提示,按下让系统更改就行了。

    最容易的方法就是,拖控件的时候让它和屏幕上显示的蓝线对齐,最后reset to suggested constraints就行了。

    不过有些情况还是需要自己来设定。

    3. 纯代码设定约束

    很多人是纯代码流,如果用纯代码来设定约束,也有很多方法,比较常见的是3种。

    1.  constraints with visualFormat

    例如

    //给文本框添加约束
        self.sendTextView.translatesAutoresizingMaskIntoConstraints = NO;
        NSString *sendStringH = [NSString stringWithFormat:@"H:|-(%d)-[_sendTextView(%f)]",padding,textViewWidth];
        NSString *sendStringV = [NSString stringWithFormat:@"V:|-(%d)-[_sendTextView]-(%d)-|",padding,padding];
        NSArray *sendTextViewConstraintH = [NSLayoutConstraint constraintsWithVisualFormat:sendStringH options:0 metrics:0 views:NSDictionaryOfVariableBindings(_sendTextView)];
        [self addConstraints:sendTextViewConstraintH];
        
        NSArray *sendTextViewConstraintV = [NSLayoutConstraint constraintsWithVisualFormat:sendStringV options:0 metrics:0 views:NSDictionaryOfVariableBindings(_sendTextView)];
        [self addConstraints:sendTextViewConstraintV];

    有两个需要注意的地方:

    因为大部分情况是相对于父视图和兄弟视图的布局,所以一定要先让父视图addSubView,然后在设定约束。

    []里要用_View,不要用self.view,这个stackOverflow上有解释。

    它的用法主要是constraintsWithVisualFormat的参数的指定参数为NSString型,指定Contsraint的属性,是垂直方向的限定还是水平方向的限定,参数定义一般如下:

    V:|-(>=x)-[_view(x)]-((>=x))-| :表示垂直方向上相对于SuperView左右间距大于、等于、小于某个距离

    若是要定义水平方向,则将V:改成H:就可以了。
    options:字典类型的值;这里的值一般在系统定义的一个enum里面选取
    metrics:nil;一般为nil ,参数类型为NSDictionary,从外部传入 //衡量标准
    views:就是上面所加入到NSDictionary中的绑定的View

    在这里要注意的是 AddConstraints  和 AddConstraint 之间的区别,一个添加的参数是NSArray,一个是NSLayoutConstraint

    使用的一些规则

    |: 表示父视图

      -:表示距离

     V:  :表示垂直

     H:  :表示水平

    >= :表示视图间距、宽度和高度必须大于或等于某个值

    <= :表示视图间距、宽度和高度必须小宇或等于某个值

    == :表示视图间距、宽度或者高度必须等于某个值

    @  :>=、<=、==  限制   最大为  1000


    一些使用例子:


    1.|-[view]-|:  视图处在父视图的左右边缘内

    2.|-[view]  :   视图处在父视图的左边缘

    3.|[view]   :   视图和父视图左边对齐

    4.-[view]-  :  设置视图的宽度高度

    5.|-30.0-[view]-30.0-|:  表示离父视图 左右间距  30

    6.[view(200.0)] : 表示视图宽度为 200.0

    7.|-[view(view1)]-[view1]-| :表示视图宽度一样,并且在父视图左右边缘内

    8. V:|-[view(50.0)] : 视图高度为  50

    9: V:|-(==padding)-[imageView]->=0-[button]-(==padding)-| : 表示离父视图的距离

    为Padding,这两个视图间距必须大于或等于0并且距离底部父视图为 padding。

    10:  [wideView(>=60@700)]  :视图的宽度为至少为60 不能超过  700 ,最大为1000

    2. 通过函数显示地添加一个个约束

    @interface NSLayoutConstraint : NSObject
    ...
    @property (readonly, assign) id firstItem;
    @property (readonly) NSLayoutAttribute firstAttribute;
    @property (readonly) NSLayoutRelation relation;
    @property (readonly, assign) id secondItem;
    @property (readonly) NSLayoutAttribute secondAttribute;
    @property (readonly) CGFloat multiplier;
    @property CGFloat constant;
    ...
    +(instancetype)constraintWithItem:(id)firstItem attribute:(NSLayoutAttribute)firstAttribute 
     relatedBy:(NSLayoutRelation)relation 
     toItem:(id)secondItem attribute:(NSLayoutAttribute)secondAttribute 
     multiplier:(CGFloat)multiplier constant:(CGFloat)constant;

    主要是通过上面的类函数显示地添加约束。

    这个我也是学习的别人的,地址:http://www.2cto.com/kf/201504/391282.html

    这个写的很详细,大家看了应该就会了。

    3. 第三方开源框架:masonry

    这个主要用块来做的,很清晰明了,大家可以去学习源码,很有益。

    不过我自己也还没看,只是把别人写的学习了下,大家有兴趣地也可以去学习

    地址:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/

  • 相关阅读:
    没有纳入spring管理的类如何注入spring管理的对象
    Servlet里面url-pattern的通配符*的使用规则
    【转】request和response的页面跳转传参
    Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(一)
    Sae上传war包找不到编译文件
    Maven配置中scope说明
    Spring配置中的classpath和classpath*的区别
    国内的ntp服务器
    U盘拷贝文件大小有限制吗?
    Genymotion安装教程
  • 原文地址:https://www.cnblogs.com/stevenfukua/p/4645503.html
Copyright © 2011-2022 走看看