在我的应用程序中,我有一个 UINavigationController。不幸的是,当我旋转设备并且界面方向发生变化时, UINavigationBar 不会改变它的高度。在其他 iPhone 应用程序中,例如 Contacts.app,导航栏在横向模式下的高度略低。它必须是内置的,因为如果您从 XCode 菜单中获取导航示例应用程序并向其添加界面方向,它确实会正确更改导航栏的高度。
我怎样才能像在我见过的所有其他 iPhone 应用程序中一样调整导航栏的大小?
最佳答案
我做了一些测试,虽然我不喜欢这种方法,但它很容易做到。
在寻找一种可能有效的私有(private)方法后,我找不到。我发现的是:
@property BOOL forceFullHeightInLandscape;
- (BOOL)isMinibar;
-isMinibar
没有 setter ,所以我们不能设置它。我猜它会根据它的高度返回一个值。另外,forceFullHeightInLandscape
设置为 NO
,但是它仍然没有调整它的高度。在更改
autoresizingMask
包括UIViewAutoresizingFlexibleHeight
, View 确实调整为更小,但现在它太小了。但是,-isMinibar
突然返回YES
.所以这让我想到让 View 自行调整大小,将其调整到合适的高度。所以我们开始了,一个有效的方法,即使没有私有(private) API 调用:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}
您必须处理的一件事是栏下方的 View 不会调整为较小的栏,因此栏和下方的 View 之间会有间隙。解决这个问题的最简单方法是添加一个容器 View ,就像
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;
}
关于cocoa-touch - UINavigationBar 自动调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538111/