1

长话短说,我想将我的 UILabel 放置在距离屏幕顶部 150pt 的位置。这使得它在 4 英寸 iOS 设备或 3.5 英寸 iOS 设备上都与顶部保持良好的距离。

但是,一旦我使用[self.navigationController setNavigationBarHidden:YES animated:NO];导航栏隐藏,这会导致视图调整大小并变高。这导致我的 UILabel 向上跳跃,我不希望它这样做。这是用户想要进入全屏视图的时候,在这种情况下,事情不应该跳来跳去。

现在您可能会说,从视图底部进行约束。这在理论上是可行的,但它会导致 UILabel 在 iPhone 5 的屏幕下方太远。我可以对值进行硬编码,但这似乎并不完全符合 Auto Layout 的精神。

基本上,一个完美的解决方案是能够将约束设置到屏幕顶部而不是视图。这样的事情可能吗?如果没有,我将如何最好地做到这一点?

4

3 回答 3

2

为顶部约束创建一个 IBOutlet(在我的示例中将其称为 topCon),并在隐藏或取消隐藏时从约束的常量中添加或减去条的高度。

- (IBAction)hideNavBar:(UIButton *)sender {
    self.navigationController.navigationBarHidden = !self.navigationController.navigationBarHidden;
    if (self.navigationController.navigationBarHidden) {
        self.topCon.constant = self.topCon.constant + self.navigationController.navigationBar.frame.size.height;
    }else{
      self.topCon.constant = self.topCon.constant - self.navigationController.navigationBar.frame.size.height;
    }
}

这将在导航栏具有不同高度的纵向和横向模式下正常工作。

于 2013-08-02T00:55:02.527 回答
0

为什么不使用导航栏高度(self.navigationController.navigationBar.frame.size.height),根据导航栏是否隐藏/可见来上下移动UILabel?

这样,您无需对任何内容进行硬编码,而是使用 UINavigationBar 属性。

于 2013-08-02T00:41:03.670 回答
0

不幸的是,AutoLayout 处理的是视图而不是屏幕。以下是一些解决方案:

1:您可以说,每当 layoutsubviews(或执行类似的触发器)时自己重新定位它。

2:您还可以将高度设置为可变的,以便在可用时占用松弛。

3:添加一个从底部锚定并填充到顶部的视图(您可以调整视图以保持相同的大小或更改,并添加此带有约束的标签以位于该视图的顶部)。

于 2013-08-02T00:43:36.047 回答