是时候了解一下 UILayoutGuide 了

Curtis74U 7年前
   <p>UILayoutGuide是 <strong>iOS 9</strong> 中增加的帮助开发者在使用auto layout布局时的一个虚拟占位对象。</p>    <p>先来看一个在布局时可能碰到的一个场景:有两个等宽的按钮,这两个按钮中间的空隙与它们到左边、右边边缘的距离相等。这样用auto layout要怎么做呢?</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2c9cb7d7e052836dc41d3d6cbfad4ba6.png"></p>    <p>约束中有相等的约束,但是并没有margin相等的约束,显然我们无法直接通过配置约束达到需求。</p>    <p>一种很常见的思路就是把边距转换为一个占位的View,这样就可以设置相等的属性了。但是这个View要设置成hidden,不应该被用户看到。这样一来我们就可以设置这三个虚拟的View宽度相等,再依次设置他们的leading、trailing约束就可以达到所要的结果了。</p>    <p>也有一种情况:两个控件,需要两个成组后居中。这种情况下我们也会引入一个View,把这两个控件加入到这个容器View中,再设置容器View的居中。</p>    <p>但是这样为了辅助布局的View有一个让人难受的地方:它在View的层级里,在事件路由的时候还是会收到消息。这就是UILayoutGuide想要解决的问题。UILayoutGuide可以被添加到View中,和View一样可以设置各种约束,参与布局。但是它不会被渲染出来,不会响应事件路由。也可以像box一样直接包含一些View。</p>    <p>下面直接用代码演示一下如何把两个控件设置居中。使用的是Snapkit做约束,没有使用原生的蹩脚API。</p>    <p>首先我们先初始化两个View和一个LayoutGuide。</p>    <pre>  <code class="language-objectivec">        letlabel = UILabel()          label.text = "UILabel"          view.addSubview(label)             lettestView = UIView()          testView.backgroundColor = UIColor.cyan          view.addSubview(testView)             letcontainer = UILayoutGuide()          view.addLayoutGuide(container)  </code></pre>    <p>LayoutGuide被添加进View使用的是 addLayoutGuide 方法。</p>    <p>接着我们设置label、testView和container的边缘相连接,并且它们之间有20的offset。</p>    <pre>  <code class="language-objectivec">        label.snp.makeConstraints { (make) in              make.left.equalTo(container)              make.centerY.equalTo(container)          }             testView.snp.makeConstraints { (make) in              make.left.equalTo(label.snp.right).offset(20)              make.height.equalTo(40)              make.width.equalTo(120)              make.right.equalTo(container)              make.centerY.equalTo(container)          }  </code></pre>    <p>这么一来,container的宽度就等于两个view的宽度加上20的offset。两个view的centerY和container一致。我们接着设置container的约束就可以了:</p>    <pre>  <code class="language-objectivec">      container.snp.makeConstraints { (make) in              make.height.equalTo(5)              make.center.equalTo(view)          }  </code></pre>    <p>运行起来就能达到目的了:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3dfd9ec0a2409a941fd776724a68f0cd.png"></p>    <p>所有需要一个虚拟View帮助的事情都可以交给UILayoutGuide来做。它更轻量、更快速、更高效。UILayoutGuide并没有真正的创建一个View,只是创建了一个矩形空间,只在进行auto layout时参与进来计算。</p>    <p> </p>    <p>来自:http://ios.jobbole.com/92308/</p>    <p> </p>