在我的应用程序中,我得到了一个UinavigationController。不幸的是,当我旋转设备并且接口方向发生变化时,Uinavigationbar不会改变其高度。在其他iPhone应用程序(例如Contacts.app)中,导航栏在景观模式下的高度略低。它必须是内置的,因为如果您从Xcode菜单中使用导航示例应用程序并将接口取向添加,则它确实会正确更改导航栏的高度。

如何像我所见过的所有其他iPhone应用程序中一样使导航栏调整大小?

有帮助吗?

解决方案

我已经进行了一些测试,尽管我不喜欢这种方法,但很容易做到。

寻找可能有效的私人方法后,我找不到一种。我发现的只是:

@property BOOL forceFullHeightInLandscape;

- (BOOL)isMinibar;

没有设置器 -isMinibar, ,所以我们无法设定。我想它根据其高度返回值。还, forceFullHeightInLandscape 被设置为 NO, ,但是它仍然没有调整其高度。

更改 autoresizingMask 包括 UIViewAutoresizingFlexibleHeight, , 风景 做过 调整大小要小,但现在太小了。然而, -isMinibar 突然回来了 YES. 。因此,这让我想到了让视图调整自身的大小,并将其调整为正确的高度。

因此,我们走了,即使没有私人API调用,也可以使用:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}

您必须处理的一件事是,栏下方的视图不会调整到较小的栏,因此栏与下面的视图之间会有差距。解决此问题的最简单方法是添加一个容器视图,就像带有一个情况的情况一样 UINavigationController. 。您会想出这样的事情:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self performSelector:@selector(resizeViewsForNavigationBar) withObject:nil afterDelay:(0.5f * duration)];
}

- (void)resizeViewsForNavigationBar {
    [self.navigationBar sizeToFit];

    // Resize containerView accordingly.
    CGRect containerViewRect = self.containerView.frame;
    containerViewRect.origin.y = CGRectGetMaxY(self.navigationBar.frame);
    containerViewRect.size.height = CGRectGetMaxY(self.view.frame) - containerViewRect.origin.y;
    self.containerView.frame = containerViewRect;
}

其他提示

我认为您想要的行为仅在导航控制器(代表栏(导航或工具栏))时才发生,将其添加到应用程序委托或由Tab Bar提出的窗口中,等等。

您可以通过IB或代码添加导航栏,这并不意味着您有一个导航控制器。我的意见是,创建一个导航控制器并使用您正在使用的视图控制器进行初始化。大概当视图旋转时,导航栏会像您喜欢的那样收缩一点。

希望这可以帮助

感谢Joost我添加了

@property BOOL forceFullHeightInLandscape;

到我的自定义uinavigationbar类。并设置为:

-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;

像魅力一样工作

与Joost的答案类似,但将方法放入 willAnimateRotationToInterfaceOrientation 比动画效果更好 willRotateToInterfaceOrientation. 。 (没有动画延迟)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar sizeToFit];
}

我也遇到了这个错误,尽管这可能不是出于同样的原因,所以我想在这里发布它来帮助其他人。

如果您要覆盖任何 willRotateToInterface 方法, 记住打电话 super

我对此一无所知,但是一旦我看到公认的答案,它就会出现在我身上。

我认为这与您相似,它们具有代码段:

iPhone:带有按钮的Uinavigationbar-调整高度

我只是在接口构建器和Xcode中尝试了一些事情,只要您使用 UINavigationBarController 作为 RootViewController 它的工作原理如描述 - 变小。您是否更改控制器本身或控制器如何加载的部分内容?特别是关于事件的解雇?我和 UITabBarController 在打破适当的消息传递并获得了一些“互相”视图副作用方面。尝试和猜测。

(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top