美文网首页
Autolayout

Autolayout

作者: CoderRH | 来源:发表于2016-08-03 17:23 被阅读10次

Autoresizing

  • 一个在AutoLayout之前处理布局的技术 处理的层面为父子层面的控件 和Autolayout不兼容

  • 基本实现

  • xibstoryboard中使用Autoresizing相对比较简单

  • 代码实现:

    - (void)viewDidLoad {
    [super viewDidLoad];
    
    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.frame = CGRectMake(0, 0, 250, 250);
    [self.view addSubview:blueView];
    self.blueView = blueView;
    
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(0, 150, 250, 100);
    redView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;
    [blueView addSubview:redView];
    

}

 - 常见的mask:

   ```objc
  UIViewAutoresizingNone                 = 0,
  UIViewAutoresizingFlexibleLeftMargin   = 1 << 0, 距离父控件左边的间距是伸缩的(不固定的)
 UIViewAutoresizingFlexibleRightMargin  = 1 << 2, 距离父控件右边的间距是伸缩的(不固定的)
 UIViewAutoresizingFlexibleTopMargin    = 1 << 3, 距离父控件顶部的间距是伸缩的(不固定的)
 UIViewAutoresizingFlexibleBottomMargin = 1 << 5, 距离父控件底部的间距是伸缩的(不固定的)
 UIViewAutoresizingFlexibleWidth        = 1 << 1, 宽度跟随父控件的宽度进行自动伸缩
 UIViewAutoresizingFlexibleHeight       = 1 << 4, 高度跟随父控件的高度进行自动伸缩

Autolayout

  • Autolayout用来处理父子和同级层面的问题
  • 6.0推出,7.0火起来
  • 核心概念:约束、参照
  • 实现方式:
  • xibstoryboard中使用Autolayout相对比较简单
  • NSLayoutConstraint实现Autolayout
  • VFL实现Autolayout

代码添加Autolayout

  • 先禁止autoresizing功能

  • view.translatesAutoresizingMaskIntoConstraints = NO;

  • 这句代码的作用是将view自带的一些autoresizing转换为AutoLayout的约束,可能会与自己添加的约束产生冲突等其他问题

  • 为什么先添加到父控件上然后再添加约束?

  • 因为有些约束需要添加到父控件上,如果没有父控件那就不知道该往哪里添加了,so crash

  • 约束添加在哪个view上?

  • 一般来说一个view的约束只要有具体数值机会可以而不需要和其他的view产生关联,那么这个约束就会添加到这个view上。比如view的宽和高约束

  • 如果一个view的一些约束关联了父控件的一些值,那么这个约束会被添加到父控件上。比如view的左边和父控件的左边对齐

  • 如果一个view和一个兄弟级别的view产生关联,那么约束会被添加到父控件身上。比如一个view和一个同级别的view的高度相等。但是如果他们没有共同的父控件,那么会添加到最近的父控件身上

NSLayoutConstraint的基本使用

  • obj1.property1 =(obj2.property2 * multiplier)+ constant value
+(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 :常量
//以上的约束在生成后一定要添加在对应的view身上

VFL - Visual Format Language

  • H:[cancelButton(72)]-12-[acceptButton(50)]:canelButton宽72,acceptButton宽50,它们之间间距12

  • H:[wideView(>=60@700)]:wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)

  • V:[redBox][yellowBox(==redBox)]:竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox高度的yellowBox

  • H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|:水平方向上,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线“|” 表示superview的边缘)

  • VFL的使用

//使用VFL来创建约束数组
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format 
                                 options:(NSLayoutFormatOptions)opts 
                                 metrics:(NSDictionary *)metrics 
                                   views:(NSDictionary *)views;
format :VFL语句
opts :约束类型
metrics :VFL语句中用到的具体数值
views :VFL语句中用到的控件

创建一个字典(内部包含`VFL`语句中用到的控件)的快捷宏定义 这个宏可以生成和对象同名的key的字典
NSDictionaryOfVariableBindings(...)

Autolayout的常见应用

  • label的Autolayout

  • label只要有位置就可以

  • label设置宽度,然后高度会根据文字自适应

  • 有的时候在xib约束label的宽度,但是代码中设置的文字又不足以填满整个label,这个时候往往想文字有多宽label就有多宽,这个时候在设置label的宽度约束的时候不要设置等于某个值,而是设置小于等于某个值

  • 一个控件的高度、宽度可以设置多个约束,比如可以设置小于等于100,大于等于50这样子

  • 一个控件的Y值可以参照上面的view1和view2两个约束,为了避免冲突将距离view2的约束值的优先级改为750,假如view1被从父控件中移除,那么控件的Y值将会参照view2的那个约束

  • 父控件的大小随着子控件的内容的大小变化而变化

  • 在一个父控件的UIView设置除了高度以外的约束,然后添加子控件label,label设置除了高度以外的约束并且设置label的底部距离父控件的底部的距离是固定的,然后如果更改label的文字,那么label的高度会变化,父控件的高度也会变化

  • NSLayoutConstaints和VFL的使用

  • NSLayoutConstraints的使用 :NSLayoutConstraints 密码:vg9y

  • VFL的使用:VFL 密码:irrn

相关文章

  • 9.4 AutoLayout使用

    AutoLayout使用 AutoLayout使用.png

  • iOS - AutoLayout -2 AutoLayout

    # iOS - AutoLayout -2 AutoLayout 上篇文章我们了解了AutoLayout 的布局方...

  • ScrollView 与 Autolayout

    ScrollView 与 Autolayout ScrollView 与 Autolayout

  • # iOS - AutoLayout -1

    iOS - AutoLayout -1 1、AutoLayout 自动布局(AutoLayout)是iOS6引入的...

  • iOS布局

    布局方式 AutoLayout,AutoresizingMask AutoLayout NSLayoutConst...

  • AutoLayout

    AutoLayout autolayout的概念 Autolayout是一种“自动布局”技术,专门用来布局UI界面...

  • 9.6AutoLayout约束基础

    AutoLayout约束基础 AutoLayout约束基础1.png AutoLayout约束基础2.png Au...

  • UI基础4

    自动布局 autoresizing:autolayout:size classes + autolayout:si...

  • AutoLayout

    AutoLayout深入浅出一[前传] AutoLayout深入浅出二[基本使用] AutoLayout深入浅出三...

  • autoLayout 和 autoresizing

    autolayout 和 autoresizing 不能够共存,使用autoLayout必须关闭aoturesizing

网友评论

      本文标题:Autolayout

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