我一定在这里遗漏了一些非常明显的东西,但这是一个让我沮丧了好几天的问题。
在 xcode 4.5 上的 iOS 项目中,我在 XIB 中有几个标签,一个在另一个之上,在一个UIScrollView
占据一个UIView
。每个标签与视图一样宽,并且每个标签比下一个标签高出大约 20 像素。有时,其中一个标签没有任何信息,因此它被设置为不可见,并且其下方的标签应该向上移动以占据空白空间。
问题是,如果在视图上“关闭”自动布局,标签将完全按照应有的方式向上移动,尽管UIScrollView
不再滚动。如果是on,无论如何,标签都不会移动。
这是代码...我基本上只是使用一个快速函数将每个标签向上移动不可见标签的高度。
[self moveObjectBy: self.festNameLabel moveByY:-(yearsLabel.frame.size.height-2)];
// this just quickly moves a label.
- (void)moveObjectBy:(UIView *)lbl moveByY:(int)byHeight {
CGRect newFrame = lbl.frame;
NSLog(@"%f, %d", newFrame.origin.y, byHeight);
newFrame.origin.y += byHeight; //yearsLabel.frame.size.height;
lbl.frame = newFrame;
}
当它运行时,NSLog
显示 Y 已移动,但它在屏幕上没有移动。我确信它与垂直空间约束有关,但它不会让我删除约束,也不会让我将其更改为视图顶部空间以外的任何内容。就像我说的,我确信我错过了一些东西,但我已经用尽了我所知道的一切......
如果您只有一个可能隐藏的标签,则可以将其下方的标签向上移动,如下所示:
-(void)contract {
self.label2.hidden = YES;
self.con2To1.constant = -34;
}
顶部标签对滚动视图的顶部有约束,所有其他标签对其上方和下方的标签有 20 点垂直距离约束。在此示例中,我隐藏了 label2。标签的高度均为 34 点,因此将约束常数从 20 更改为 -34 将当前隐藏的标签移动到其上方标签的正上方。
要将此方法与可以隐藏的多个标签一起使用,您需要为每个要隐藏的标签及其对上面标签的约束提供一个出口。实际上,您可以在没有约束条件的情况下做到这一点,但我不知道它是否会那么强大(它可能会选择错误的约束)。我可以通过循环遍历约束来找到与特定标签相关的约束,并且是该标签顶部的约束来执行相同的操作:
-(void)hideLabel:(UILabel *) label {
label.hidden = YES;
for (NSLayoutConstraint *con in self.scroller.constraints) {
if (con.firstItem == label && con.firstAttribute == NSLayoutAttributeTop) {
con.constant = -34;
}
}
}
如果您愿意,可以修改相同的方法以使用动画 - 以下代码片段会淡出您想要隐藏的标签,同时对所有下部标签进行向上移动的动画。
-(void)hideLabel:(UILabel *) label {
for (NSLayoutConstraint *con in self.scroller.constraints) {
if (con.firstItem == label && con.firstAttribute == NSLayoutAttributeTop) {
con.constant = -34;
[UIView animateWithDuration:.5 animations:^{
label.alpha = 0;
[self.scroller layoutIfNeeded];
}];
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)