• NSLayoutConstraint extension


    NSLayoutConstraint 提供了更加强大的表达能力相比 UIViewAutoresizing,UIViewAutoresizing只是定义了父视图和子视图的关系,无法表示视图与视图之间的关系。而NSLayoutConstraint不但可以表达父视图与子视图之间的关系,同时提供了描述视图之间的关系的能力。尤其时随着iPhone屏幕大小的改变,NSLayoutConstraint的意义重大。

    NSLayoutConstraint提供了两个api生成视图之间的限制:(NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views 和 

    constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c。constraintsWithVisualFormat 和 constraintWithItem 互为补充,可以描述视图之间所有的可能性。constraintWithItem 功能强大,可以描述所有可能的关系,但是一次只能生成一个 NSLayoutConstraint 对象。而constraintsWithVisualFormat 使用了一种描述语言 Visual Format Language, 提供了更强大的表达能力,当然它也有自己的缺点,比如无法完全描述视图之间的大小关系,如果需要实现这种限制,必须使用 constraintWithItem 完成。constraintsWithVisualFormat的优点在于一次可以生成多个NSLayoutConstraint。如下图所示,需要生成放置在屏幕左上角,水平对齐的等大小的button-first 和 second,则可以使用constraintsWithVisualFormat来实现。使用三个visual format 语句@"|-[firstButton]-[secondButton]-|", @"V:|-[firstButton]", @"[firstButton(secondButton)]"便可以确定first 和 second 按钮的大小和位置,但是这里需要调用constraintsWithVisualFormat三次方能完成这个功能,实属有些麻烦。

    因此,这里考虑扩展NSLayoutConstraint,使其支持一次处理多个visual format,描述如下,

    @"|-[firstButton]-[secondButton]-|,V:|-[firstButton],[firstButton(secondButton)]"

    这里扩展了Visual Format Language,使用“,”分割不同的 visual format,提高了表达能力。这里便提供了新的分类 NSLayoutConstraint(MultiItems)处理这种扩展的Visual Format Language,提供了两个新的api- 

    constraintsWithMultiVisualFormats 和 constraintsWithMultiVisualFormatsWithMultiOptions,分别对应单个的 NSLayoutFormatOptions 和 多个 NSLayoutFormatOptions。

    具体的源码可以在https://github.com/zhzhy/NSMutilItemLayoutConstraint下载,包含DEMO。

  • 相关阅读:
    写在读ng之前的基础知识----笔记
    angularJS中-$route路由-$http(ajax)的使用
    angular学习-入门基础
    grunt使用watch和livereload的Gruntfile.js的配置
    jQuery1.4源码解读
    Handlebars的使用方法文档整理(Handlebars.js)
    zepto源代码解读
    CentOS 安装rz和sz命令
    Linux下*.tar.gz文件解压缩命令
    Linux下用rm删除的文件的恢复方法
  • 原文地址:https://www.cnblogs.com/CoderPlace/p/2931801.html
Copyright © 2020-2023  润新知