【问题标题】:UINavigationBar autoresizingUINavigationBar 自动调整大小
【发布时间】:2011-04-02 01:46:14
【问题描述】:

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

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

【问题讨论】:

    标签: cocoa-touch uikit uiview uinavigationbar autoresize


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答,我现在无法测试,但我会在尝试后报告。有趣的是,容器视图确实已经正确调整大小,就好像导航栏变短了一样。
    • 我刚刚试了一下,效果很好!由于容器视图已经正确调整大小,我只需要sizeToFit 调用。
    • 太好了。不过,您可能想发送错误报告,因为您使用的是默认的UINavigationController,它应该可以正常工作。容器已经正确调整大小,所以 UINavigationBar 也应该调整。
    • 此修复的细微变化可能对今天的人们有所帮助(这仍然发生在 iOS10 中)。如果您不想折叠到状态栏但仍需要调整宽度,这会有所帮助。 self.navigationBar.frame = CGRectMake(self.navigationBar.frame.origin.x, self.navigationBar.frame.origin.y, [self.navigationBar sizeThatFits:self.navigationBar.bounds.size].width, self.navigationBar.frame .size.height);
    【解决方案2】:

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

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

    希望对你有帮助

    【讨论】:

    • 这正是我所做的,不,它不起作用。不过感谢您的回答!
    【解决方案3】:

    感谢 Joost 我添加了

    @property BOOL forceFullHeightInLandscape;
    

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

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

    工作就像一个魅力

    【讨论】:

    • 您也可以在 UINavigationBar 类别中覆盖它:- (BOOL)forceFullHeightInLandscape { return YES; }
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      如果您要覆盖任何 willRotateToInterface 方法,记得调用 super

      我对此一无所知,但一旦我看到接受的答案,它就来了。

      【讨论】:

        【解决方案6】:

        我觉得这个有点像你,他们的代码是sn-p:

        iPhone: UINavigationBar with buttons - adjust the height

        【讨论】:

        • 你确定导航栏高度收缩不是内置的吗?
        • 它必须是内置的,因为如果您从 XCode 菜单中获取导航示例应用并为其添加界面方向,它确实会正确更改导航栏的高度。
        【解决方案7】:

        我只是在 Interface Builder 和 Xcode 中尝试了一些事情,只要您将 UINavigationBarController 用作 RootViewController,它就可以按描述工作 - 变得更小。您是否更改了控制器本身或控制器加载方式的部分内容?特别是关于事件的触发?在破坏正确的消息传递方面,我对UITabBarController 有一些不好的体验,并得到了一些“有趣”的视图副作用。只是尝试和猜测。

        【讨论】:

        • 好吧,我确实也在使用 UITabBarController。除此之外,我使用代码创建所有内容,而不使用 Interface Builder。
        • 啊,好的,看到它已经得到回答我很好奇如果你只是以编程方式使用 UITabBar 会怎样。它仍然不起作用吗?我认为它都包含在 RootViewController 中。也许这不是一个真正的错误,但不能与两个控制器一起正常工作。如果您尝试使用 Interface Builder 执行此操作,它无论如何都不会执行,不允许将 NavigationBarController 与 UITabBarController 混合。
        【解决方案8】:
        (void)viewWillLayoutSubviews {
              self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多