Cen*_*ion 18 objective-c ios autolayout
我有一个表格视图和里面的单元格.该单元格包含三个标签:标题标签和两个彼此相同的标签.有时,如果它们不包含数据并将"Header label"的"Top space to container"更改为"Center Y to container",我需要隐藏下面的两个标签.当然,当两个标签包含数据时,还原约束.这是一个简单的演示项目的屏幕截图,仅用于展示这个想法:

更新 Max MacLeod的回答指向了正确的方向.诀窍是在隐藏第一个和第二个标签时向下推标头标签.因此,我们需要为第一个和第二个标签设置底部空间到容器视图,而不是为标题标签的容器视图创建顶部空间.隐藏/取消隐藏应该通过高度出口(第一个和第二个标签的高度约束)并将它们的常量值设置为零(并在取消隐藏时设置返回值)来完成.我还将源代码示例上传到Github.
Max*_*eod 34
选择标题标签和其中一个较低标签,然后添加一个新的垂直空间约束,以反映它们之间的间隙.接下来,删除标题标签顶部空间到容器约束.也许你已经拥有了这个(从屏幕抓取中看不到).如果你这样做,这很好.
现在,为每个下标签创建两个高度约束.IBOutlet那些你的班级.
然后,只要通过设置每个高度约束的需要隐藏这两个较低的标签constant来0.f.
这将使它们不可见并降低上面的标题标签,以便它现在在容器中垂直居中Y.
将再次执行这些步骤(评论太长了!).顺序对IB很重要,首先必须添加新约束才能删除旧约束.暂时你会有一个多余的约束.这是因为IB不会允许含糊不清.因此,首先添加新的垂直空间约束.这将定义上标签的Y位置.然后,从上面的标签中删除多余的垂直空间到容器约束.现在,标签将使用相对于下部标签的垂直空间定位Y. 接下来,为每个较低标签添加高度约束,并使用IBOutlet链接到该类.另外一件事,实际上你需要将低标签约束到具有底部空间约束的容器.当它们的高度减小到零时,它们将消失,并且上部标签将向下移动以占据Y中心位置.
要恢复,只需将其设置constant回原始值即可.
这是一个比添加/删除约束更好的方法,这是一个重量级的操作.请注意,您可能希望将两个较低的标签添加到"容器"视图中,以便它们可以显示/隐藏为一个.此外,它会整理代码,因为您真的希望垂直空间位于上标签和两个下标签之间,而不仅仅是一个.
另请参阅我的回答AutoLayout隐藏的UIViews?
将所有要隐藏的标签放入视图中,一旦所有内容都具有正确的布局约束,将高度约束添加到容器视图,并将约束连接到IBOutlet属性中.
确保您的属性 strong
在代码中你只需要将常量设置为0并激活它,隐藏内容,或者停用它来显示内容.这比弄乱固定值还原它更好.不要忘记layoutIfNeeded事后打电话.
@property (strong, nonatomic) IBOutlet UIView *myContainer;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!!
Run Code Online (Sandbox Code Playgroud)
-(void) showContainer
{
self.myContainerHeight.active = NO;
self.myContainer.hidden = NO;
[self.view layoutIfNeeded];
}
-(void) hideContainer
{
self.myContainerHeight.active = YES;
self.myContainerHeight.constant = 0.0f;
self.myContainer.hidden = YES;
[self.view layoutIfNeeded];
}
Run Code Online (Sandbox Code Playgroud)
完成设置后,可以通过将约束设置为0然后返回原始值来在IntefaceBuilder中对其进行测试.不要忘记检查其他约束优先级,所以当隐藏时根本没有冲突.测试它的其他方法是将其设置为0并将优先级设置为0,但是,您不应该忘记将其恢复到最高优先级.
| 归档时间: |
|
| 查看次数: |
21421 次 |
| 最近记录: |