在我的应用程序中,我有一个UINavigationController。不幸的是,当我旋转设备并且界面方向改变时,UINavigationBar并没有改变其高度。在其他iPhone应用程序(例如Contacts.app)中,在横向模式下,导航栏会略微缩短。这一定是内置的,因为如果您从XCode菜单中获取导航示例应用程序并添加接口方向,则会正确更改导航栏的高度。
如何使导航栏像我看到的所有其他iPhone应用程序一样调整大小?
在我的应用程序中,我有一个UINavigationController。不幸的是,当我旋转设备并且界面方向改变时,UINavigationBar并没有改变其高度。在其他iPhone应用程序(例如Contacts.app)中,在横向模式下,导航栏会略微缩短。这一定是内置的,因为如果您从XCode菜单中获取导航示例应用程序并添加接口方向,则会正确更改导航栏的高度。
如何使导航栏像我看到的所有其他iPhone应用程序一样调整大小?
我已经进行了一些测试,虽然我不喜欢这种方法,但这很容易实现。
尽管我寻找了可能有效的私有方法,但我找不到。我发现的只有:
@property BOOL forceFullHeightInLandscape;
- (BOOL)isMinibar;
-isMinibar
没有 setter 方法,因此我们不能设置它。我猜它的返回值是基于它的高度。同时,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;
}
@property BOOL forceFullHeightInLandscape;
将以下代码添加到我的自定义UINavigationBar类中,并设置:
-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;
非常有效
- (BOOL)forceFullHeightInLandscape
{
return YES;
}
- Sandy ChapmanwillAnimateRotationToInterfaceOrientation
中比将其放在willRotateToInterfaceOrientation
中具有更好的动画效果。(没有动画延迟)- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar sizeToFit];
}
我刚刚在Interface Builder和Xcode中尝试了一些东西,只要您将UINavigationBarController
用作RootViewController
,它就像描述的那样工作-变小。您是否在控制器本身或控制器加载方式的某些部分进行了任何更改?特别是涉及事件触发方面的更改?我曾经有过一些关于UITabBarController
破坏适当消息传递并产生一些“有趣”的视图副作用的不良经历。这只是一个尝试和猜测。
我认为这个与您的情况有些类似,并且它们有代码片段:
(void)viewWillLayoutSubviews {
self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}
sizeToFit
调用。 - ryystUINavigationController
,它应该可以正常工作。容器已经正确地调整大小,所以UINavigationBar
也应该如此。 - Joost