• IOS AutoLayout 代码实现约束—VFL


    在autolayout下,尽管使用IB来拖放控件,但仍然避免不了用代码来创建控件,这是约束需要代码来实现。

    IOS 提供了两种添加约束的方法

    第一种:

    +(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

    第二种:

    + (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

    第一种方法返回的是一个约束对象,也就是一条约束。看参数也比较好理解,就是在view1与view2之间设定一条约束,但往往一个控件需要好几条约束来约束,加上如此长的方法,所以导致一个控件就需要大量的代码来实现约束。

    第二种方法返回的是array,包含的是一组约束,所以一般一个控件,调用两次第二种方法就能实现约束。所以这种方法更加的简洁,但是这种方法用到的是一种描述性语言,有点不好理解,下面就来简单介绍下第二种方法的用法。

    先对这些参数进行说明:

    (NSDictionary*)views:表示这组约束所涉及到的相关子view,比如一个界面上有    A、B两个控件,这组约束涉及到了这两个控件,那么就以字典类型将A、B控件设为参数views,可以用NSDictionaryOfVariableBindings(A, B) 等效于 [NSDictionary dictionaryWithObjectsAndKeys:A @“A”, B, @“B'', nil];

    (NSDictionary*)metrics:对于一些特定的宽、高,我们可以直接存放在字典中,这样在描述性语言中就可以直接用键来描述宽高。如:

    NSDictionary *metrics = @{@"buttonWidth":@200.0};

    (NSLayoutFormatOptions) opts:见枚举类型,解释部分。

    常用的就这些:

    NSLayoutFormatAlignAllLeft//控件之间左对齐

    NSLayoutFormatAlignAllRight//控件之间右对齐

    NSLayoutFormatAlignAllTop//...上对齐

    NSLayoutFormatAlignAllBottom//...下对齐

    NSLayoutFormatAlignAllLeading // 使所有视图根据当前区域文字开始的边缘对齐(英语:左边,希伯来语:右边)

    NSLayoutFormatAlignAllTrailing // 使所有视图根据当前区域文字结束的边缘对齐(英语:右边,希伯来语:左边)。

    NSLayoutFormatAlignAllCenterX // 使所有视图通过设置中心点的 X 值彼此相等来对齐。

     

    (NSString*)format 这就是核心VFL语句了,举例说明(H表示水平方向,V表示垂直方向)

    H:|-[view]-|        //view与superview的左右边界为标准间距

    H:|-[view]         //view与superview的左边界为标准间距,右边不处理

    H:|[view]          //view与superview的左边界对齐,右边不处理

    H:|-20.0-[view]-30.0f-|  //view与superview的左边边界间距分别为20,和30

    H:[view(100.0)]      //view宽度为100

    H:|-[button1(button2)]-[button2]-| //button1与button2等宽,之间为标准间距.....

    V:|-20.0-[view(30.0)] //view距顶部边界20,自身高度为30.0

    //注意:在写两个控件左右边距或者上下边距的时候,控件输写的顺序请按照UI界面的顺序写。

    也就是说@“H:[_nameTextField]-20-[button]”表示_nameTextfield与button之间的间距为20,_nameTextField在左边,button在右边;

    @“H:[button]-20-[_nameTextField]”表示button与_nametextField之间的距离为20,button在左边,_nameTextField在右边。

    //注意:在写两个控件之间的距离时,左右两边不能加两个||

     

    为了实现约束,我们只需要先初始化这些控件,但在autolayout中不需要用alloc来初始化,而且要关掉autoresizing constraints

    UIView *view = [self new];

    view.translatesAutoresizingMaskIntoConstraints = NO;

     

    PS:Demo还在整理过程中,整理好了马上上传。

     

  • 相关阅读:
    Oracle10g之SGA与PGA分配建议
    Oracle 用户权限管理方法
    快速部署RDA Remote Diagnostic Agent
    转 :Oracle 数据库信息收集工具RDA使用指南 Oracle 数据库信息收集工具RDA使用指南
    AIX6.1下配置Nmon性能工具
    优化 AIX 6.1 的性能
    使用Oracle外部表来查询分析警告日志
    qq
    Java字符串2
    java字符串
  • 原文地址:https://www.cnblogs.com/FightingLuoYin/p/4355954.html
Copyright © 2020-2023  润新知