iOS笔记_03_Autolayout

1.Autoresizing

  • 在Autolayout之前,有Autoresizing可以作屏幕适配,但局限性较大,有些任务根本无法完成
  • 相比之下,Autolayout的功能比Autoresizing强大很多
  • 局限性
    • 只能解决子控件跟父控件的相对关系问题
    • 不能解决兄弟控件的相对关系问题
  • 代码
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, // 距离父控件左边的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleRightMargin = 1 << 2, // 距离父控件右边的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleTopMargin = 1 << 3, // 距离父控件顶部的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleBottomMargin = 1 << 5, // 距离父控件底部的间距是伸缩的(不固定的)
UIViewAutoresizingFlexibleWidth = 1 << 1, // 宽度跟随父控件的宽度进行自动伸缩
UIViewAutoresizingFlexibleHeight = 1 << 4, // 高度跟随父控件的高度进行自动伸缩

2.Autolayout的核心概念

  • 代码实现Autolayout的步骤
    • 利用NSLayoutConstraint类创建具体的约束对象
    • 添加约束对象到相应的view上
- (void)addConstraint:(NSLayoutConstraint *)constraint; - (void)addConstraints:(NSArray *)constraints;
  • 代码实现Autolayout的注意点
    • 要先禁止autoresizing功能,设置view的下面属性为NO

      view.translatesAutoresizingMaskIntoConstraints = NO;
    • 添加约束之前,一定要保证相关控件都已经在各自的父控件上
    • 不用再给view设置frame
  • 一个NSLayoutConstraint对象就代表一个约束
  • 创建约束对象的常用方法
+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
/* view1 :要约束的控件 attr1 :约束的类型(做怎样的约束) relation :与参照控件之间的关系 view2 :参照的控件 attr2 :约束的类型(做怎样的约束) multiplier :乘数 c :常量 自动布局的核心计算公式 obj1.property1 =(obj2.property2 * multiplier)+ constant value */
  • 使用VFL来创建约束数组
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

/*  format :VFL语句
    opts :约束类型
    metrics :VFL语句中用到的具体数值
    views :VFL语句中用到的控件

创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义
NSDictionaryOfVariableBindings(...)
*/

3.基于Autolayout的动画

  • 在修改了约束之后,只要执行下面代码,就能做动画效果
[UIView animateWithDuration:1.0 animations:^{ [添加了约束的view layoutIfNeeded]; }];

小结:约束用代码写的话还是比较长的,推荐第三方框架Masonry,作者封装的很好,调用起来也非常简单。

你可能感兴趣的:(ios,控件)