ios 约束(四)

来源:互联网 发布:json格式化一行 编辑:程序博客网 时间:2024/06/07 05:53

1 格式字符串

    1、方向

    字符串开头的哪个可选项目表示约束规则所针对的方向,H:表示水平方向,V:表示垂直方向。意思是说,这条规则所约束的是左右方向的布局还是上下方向的布局。假如省略该项目,那么默认就表示左右方向。比方说有这样一个约束字符串:“H:[view1][view2]”,它的含义就是把view2直接放在view1右侧。H表示这条约束规则所针对的方向。


    接下来再看一个垂直布局的范例:“V:|[view1]-20-[view2]-20-[view3]”。这条约束规则在view1与其下方的view2之间留出了20点的空白,然后又在view2与其下方view3之间留出了20点空白。

    如果不继续施加约束,那么仅仅凭借目前的约束规则是无法将界面准确排布好的。Auto Layout会自行决定剩下的部分,不过它选出了的布局通常是错误的。在左侧截图中,还应该指定垂直方向的约束规则。如果不指定,那么两个视图就会像本例这样全都贴着上级视图的定边。而在右侧的截图中,还应指定水平方向的约束规则。如果不指定,那么三个视图就会像本例这样全部都紧靠上级视图的左界。

完成上面效果:

    [self.view addConstraint:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view1][view2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view1,view2)]];    [self.view addConstraint:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view1]-20-[view2]-20-[view3]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view1,view2,view3)]];

    注意上面这个格式的字符串开头的竖线。竖线总是代表上级视图。我们只会在格式字符串的首位两端看到它。如果出现在开头,那么他就会紧跟着表示水平方向或垂直方向的那个标识符(比方说“V:|...”或“H:|...”)。要是它出现在末尾,那么久放在字符串结束处的那个引号之前(“...|”)。

    2、连接

    在视图名称之间放置连接,就可以指定视图的排布流程了。空连接表示紧跟其后。    

    在上面图片的第一条约束规则是“H:[view1][view2]”,它里面就用到了空连接。在view1的右方括号与view2的作方括号之间没有其他内容,这就表示此约束规则要求view2直接出现在view1右侧。

    连字符表示一小段固定空间。“H:[view1]-[view2]”这条规则就用连字符来表示视图之间的连接,他会在view1与view2之间留出标准的空白图5-3.


    如果在两个连字符之间放上数值常数,那么就可以精确的指定间隔尺寸了。“H:[view1]-30-[view2]”这条约束规则会在两个视图之间添加30点的空白。5-4


    “H:|[view1]-[view2]|”这个格式字符串会从上级视图开始,逐步描述水平方向上的排布方式。上级视图的边界紧贴着view1的边界,view1后面是一段间隔,间隔后面再跟着view2,而view2的后边沿也紧贴着上级视图,整个效果如5-5


    这条约束规则会将view1与上级视图左对齐,同时将view2与上级视图右对齐。为了实现这种布局,系统必须放弃一些原有的设定才行。要么调整左边那个视图的大小,要么调整右边那个视图的大小,只有这样,才能满足此约束规则。

    很多情况下,我们不想令视图的边界紧贴着上级视图。于是,可以指定“H:|[view1]-[view2]-|”规则,它与上面那条规则类似,只是会在上级视图的左边界与view1的左边界之间留出空白,同时也会在view2的右边界与上级视图的右边界之间留出空白。5-6


    对于视图与上级视图之间的空白,其尺寸遵循标准IB/Cocoa Touch布局规则,苹果公司没有在iOS API中说明其细节。视图边界与上级视图边界之间的空白一般要比同级视图之间的默认空白大一些。

    要想在两个视图之间插入灵活的空白,也是有办法来实现的。我们可以指定两者的关系规则(比方说“H:|-[view1]-(>=0)-[view2]-|”),使其在保持各自尺寸不变的前提下,既能相互拉开一段距离,又能在自身边界与上级视图边界之间留出空白,5-7.这条规则的意思是两视图之间至少有0个点的间隔。该规则使得系统在排布这两个视图的时候可以灵活的调整其间距。这条关系规则里面所使用的那个数字应该小一些才对,不然的话,可能会无意间干扰视图的其他几何规则。


    字符串里面当然不局限于一道两个视图,也可以放入三四个,或者更多的视图。比方说可以写出这样一条约束规则:“H:|-[view1]-[view2]-(>=5)-[view3]-|”。第三个视图与另外两个视图之间留有灵活的空白。5-8


2、谓词

    上面最后两个范例都用到了带有比较运算符的关系规则。这些规则也叫谓词,它是对视图元件之间的关系所下的断言。谓词需要用圆括号括起来。比方说,我们可以用下面这个字符串来规定视图的尺寸至少是50点:

    [view1(>=50)]

    该谓词只和一个视图有关。请注意,这个谓词出现在描述视图所用的那一对方括号之内,而没有像上面那样出现在两个视图之间的连接处。谓词并不局限于单个标准。例如,我们可以用类似的规则指明视图的尺寸必须在50点到70点之间。如果要添加复合谓词,那么请把规则的各个部分用逗号隔开:

    [view1(>=50,<=70)]

    相对关系谓词可以规定视图尺寸的增长方式。如果想令某视图尽量占满其上级视图,那么可以宣称其尺寸是大于0的值。下面这条规则会在水平反向上拉伸view1,使其在保留边界空白的前提下,尽量填满上级视图:

    H:|-[view1(>=0)]-|  5-9

    如果要指定的等同关系(==),那么可以在格式字符串的谓词里吧两个等号省掉。比方说,[view1(==120)]等价于[view1(120)],而[view1]-(==50)-[view2]和[view1]-50-[view2]的含义是相同的。

  1、指标

    如果事先不知道常量值是多少(也就是说,我们无法预先确定常量是120或50这样的数值),那么可以通过metrics(指标)字典来提供该值。在调用创建约束规则的方法时,我们把该字典作为metrics参数传进去。下面这个格式字符串就用指标描述了其值尚不明确的常量:

    [view1(>=minwidth)]

    minwidth这个占位符必须能够映射到metrics字典里的某个NSNumber值。

    2、描述两个视图关系的谓词

    谓词并不局限数字常量。我们也可以在两个视图的尺寸之间建立关系,以保证某个视图不会比另一个视图更大。下面这个例子限定了view2的尺寸,使其在目前所涉及的这条轴上不会比view1更大:

    [view2(<=view1)]

    用格式字符串来描述视图之间的比较关系只适用于一些简单的场合。如果想建立更为复杂的关系,比方说要描述中心点、顶边及高度之间的关系,那就不要使用可视化的格式字符串了,而是应该改用针对项目的约束构造器。

    3、优先级

    每条约束规则都可以通过@来指定优先级,符号后面可以是数字,也可以是某项指标。比方说,我们想把view1的尺寸定为500点,但又想把这条规则的优先级设置的低一些,那么可以使用下列字符串:    

    [view1(500@10)]

    优先级要放在谓词之后。例如,下面就是一个在谓词中嵌有优先级的格式字符串:

    [view1]- (>=50@30)-[view2]    

0 0
原创粉丝点击