UINavigationBar自动调整

时间:2010-08-21 15:54:49

标签: cocoa-touch uikit uiview uinavigationbar autoresize

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

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

8 个答案:

答案 0 :(得分:19)

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

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

@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;
}

答案 1 :(得分:2)

我认为只有当导航控制器(代表条形图(导航或工具栏))被添加到应用程序委托中的窗口或由标签栏等呈现时,才会发生您想要的行为。

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

希望这有帮助

答案 2 :(得分:2)

感谢Joost我添加了

@property BOOL forceFullHeightInLandscape;

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

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

像魅力一样工作

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

我刚刚也遇到了这个错误,虽然这可能不是出于同样的原因,但我想在这里发布它以帮助其他任何人。

如果您覆盖任何willRotateToInterface方法,请记得致电super

我对此感到茫然,但是一旦我看到了接受的答案,我就来了。

答案 5 :(得分:0)

我认为这个与你类似,他们有代码片段:

iPhone: UINavigationBar with buttons - adjust the height

答案 6 :(得分:0)

我只是在Interface Builder和Xcode中尝试了一些内容,只要您使用UINavigationBarController作为RootViewController它就像所描述的那样工作 - 变小。您是否更改了控制器本身内部或控制器加载方式的部分内容?特别是关于事件的解雇?在打破正确的消息传递和获得一些“有趣的”视图副作用方面,我对UITabBarController有一些不好的经验。只是一个尝试和猜测。

答案 7 :(得分:-1)

(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}