zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    jvm-类加载
    jvm调优
    jdk8与jdk9的共存
    eclipse的插件开发-启动时间
    斐波那契数列算法逐层优化(C++)
    2G.处女座与复读机(C++)
    3I.处女座的约会(C++)
    3D.处女座的训练(C++)
    3E.处女座和小姐姐(C++)
    3C.处女座点名(C++)
  • 原文地址:https://www.cnblogs.com/CoderPlace/p/2931801.html
Copyright © 2011-2022 走看看