如何限制从顶部定位我的标签,但在隐藏导航栏时不让它移动(因为它会调整视图高度)?

Posted

技术标签:

【中文标题】如何限制从顶部定位我的标签,但在隐藏导航栏时不让它移动(因为它会调整视图高度)?【英文标题】:How do I make a constraint to position my label from the top, but not have it move when I hide the navigation bar (as it adjusts height of view)? 【发布时间】:2013-08-02 00:35:38 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

为顶部约束创建一个 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;
    

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于如何限制从顶部定位我的标签,但在隐藏导航栏时不让它移动(因为它会调整视图高度)?的主要内容,如果未能解决你的问题,请参考以下文章

打开搜索栏时导航栏隐藏

如何点击按钮在顶部而不是中间加载导航标签页?

如何隐藏特定屏幕上的顶部标签栏?

定位徽标和导航栏时遇到问题

我在屏幕上放置了一个带有自动布局的 UILabel,但是当我隐藏导航栏时,它会导致标签“抽搐”一秒钟 [重复]

iOS App 从屏幕顶部偏移