Cocoa touch UINavigationBar自动调整大小

Cocoa touch UINavigationBar自动调整大小,cocoa-touch,uikit,uiview,uinavigationbar,autoresize,Cocoa Touch,Uikit,Uiview,Uinavigationbar,Autoresize,在我的应用程序中,我得到了一个UINavigationController。不幸的是,当我旋转设备并且界面方向改变时,UINavigationBar不会改变其高度。在其他iPhone应用程序中,如Contacts.app,在横向模式下导航栏的高度会稍微降低。它必须是内置的,因为如果您从XCode菜单获取导航示例应用程序并向其添加界面方向,它确实会正确更改导航栏的高度 我如何才能像我见过的所有其他iPhone应用程序一样调整导航栏的大小?我认为这一个类似于您,它们有代码片段: 我做了一些测试,虽然

在我的应用程序中,我得到了一个UINavigationController。不幸的是,当我旋转设备并且界面方向改变时,UINavigationBar不会改变其高度。在其他iPhone应用程序中,如Contacts.app,在横向模式下导航栏的高度会稍微降低。它必须是内置的,因为如果您从XCode菜单获取导航示例应用程序并向其添加界面方向,它确实会正确更改导航栏的高度


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

我认为这一个类似于您,它们有代码片段:


我做了一些测试,虽然我不喜欢这种方法,但很容易做到

在寻找一种可能有效的私有方法之后,我没有找到一种。我只发现:

@property BOOL forceFullHeightInLandscape;

- (BOOL)isMinibar;
-isMinibar
没有设置器,因此无法设置。我猜它会根据高度返回一个值。另外,
forcellheightinscape
被设置为
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;
}

我认为,只有当导航控制器(代表栏(导航或工具栏))添加到应用程序委托中的窗口或由选项卡栏等显示时,才会出现您想要的行为

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


希望这有帮助

我只是在Interface Builder和Xcode中尝试了一些东西,只要您使用
UINavigationBarController
作为
RootViewController
它就可以正常工作-变小了。您是否更改了控制器本身或控制器加载方式的部分内容?特别是关于射击事件?我对
UITabBarController
在破坏正确的消息传递方面遇到了一些糟糕的过期问题,并得到了一些“有趣的”视图副作用。只是一个尝试和猜测。

我也有这个错误,虽然可能不是出于同样的原因,但我还是想把它贴在这里,以帮助其他犯错误的人

如果要重写任何
willRotateToInterface
方法,请记住调用
super


我对此茫然不知所措,但当我看到被接受的答案时,我想到了。

多亏了Joost,我才添加了这个答案

@property BOOL forceFullHeightInLandscape;
我的自定义UINavigationBar类。并设置为:

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

与Joost的答案类似,它的效果非常迷人,但将该方法放入
WillAnimateRotationInterfaceOrientation
willRotateToInterfaceOrientation
具有更好的动画效果。(没有动画延迟)


您确定导航栏高度收缩不是内置的吗?它必须是内置的,因为如果您从XCode菜单中获取导航示例应用程序并向其添加界面方向,它确实会正确更改导航栏的高度。感谢您的回答,我现在无法测试它,但我会在尝试后报告。有趣的是,容器视图已经正确地调整了大小,就好像导航栏已经变短了一样。我刚刚试用过,效果非常好!由于容器视图的大小已经正确调整,我只需要调用
sizeToFit
,太好了。不过,您可能需要发送错误报告,因为您使用的是默认的
UINavigationController
它应该可以正常工作。容器已正确调整大小,因此
UINavigationBar
也应该正确调整大小。此修复程序的细微变化可能会对今天的人们有所帮助(在iOS10中仍然会发生这种情况)。如果您不想折叠到状态栏中,但仍需要调整宽度,这将非常有用。self.navigationBar.frame=CGRectMake(self.navigationBar.frame.origin.x,self.navigationBar.frame.origin.y,[self.navigationBar sizehattfits:self.navigationBar.bounds.size].width,self.navigationBar.frame.size.height);这正是我所做的,不,它不起作用。谢谢你的回答!嗯,我确实也在使用UITabBarController。除此之外,我正在用代码创建所有东西,没有界面生成器。啊,好吧,看到它已经得到了回答,我很好奇,如果你只是通过编程方式使用UITabBar会怎么样。它是否仍然不起作用?我假定它都包含在RootViewController中。也许这不是一个真正的错误,但不能与两个控制器正常工作。如果您尝试使用Interface Builder执行此操作,它无论如何都不会执行,不允许将NavigationBarController与UITabBarController混合使用。您还可以在UINavigationBar类别中覆盖此项:
-(BOOL)forcellheightIn横向{返回YES;}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar sizeToFit];
}
(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}