【问题标题】:UIToolbar height on device rotation设备旋转时的 UIToolbar 高度
【发布时间】:2011-07-10 08:12:36
【问题描述】:

来自 iOS 人机界面指南,iOS UI Element Usage Guidelines

在 iPhone 上,请考虑 工具栏高度的自动变化 发生在设备旋转。在 特别是,确保您的自定义 工具栏图标非常适合较薄 横屏显示的栏 方向。不要指定高度 以编程方式的工具栏。

例如,我可以在 MailiPhone 版 TwitterDropbox 中看到高度从 44 点变为 32 点,但是当我添加一个工具栏(使用 Interface Builder)并让我的 UIViewController 子类自动旋转(shouldAutorotateToInterfaceOrientation: 返回 YES),工具栏不会在设备旋转时自动更改其高度。

UIToolbar Class Reference 没有提到这种高度的自动变化,所以即使 HIG 说 不要以编程方式指定工具栏的高度,我是否应该以编程方式更改它?

【问题讨论】:

    标签: iphone ios uitoolbar


    【解决方案1】:

    您是否检查了工具栏的自动调整大小属性?

    【讨论】:

    • 就是这样,您必须以编程方式执行toolbar.autoresizingMask = toolbar.autoresizingMask | UIViewAutoresizingFlexibleHeight;,因为 Interface Builder 不允许您更改灵活高度!
    • 这个解决方案对iOS5.0没有副作用吗?它工作正常,但工具栏中的图标始终具有横向(=较小)尺寸,即使是纵向的:/
    • 我第二个 yonel - 图标在两个方向上都保持小尺寸。此外,一旦旋转,它就无法正确定位 - 屏幕底部有一个额外的未覆盖像素。我想知道在 IB 中禁用调整大小蒙版是否有上帝的理由......
    • 我认为您看到像素问题和图标大小问题有两个原因。首先,像素问题是因为您的支柱没有为工具栏上方/下方的视图正确设置。其次,图标大小问题可能是因为您正在调整 viewDidLoad 方法中的 autoresizingMask。尝试在 viewWillAppear 方法中执行此操作。这样做可以使其在 iOS 6 中按预期工作。
    • @0xced 您可以在 Interface Builder 中找到自动调整大小的蒙版。只需转到“大小”标签,您就会在左侧看到自动调整大小框
    【解决方案2】:

    使用自动布局实现此行为要简单得多。我只在 iOS8 中进行了测试,但以下代码适用于我所需的方向更改动画:

    public override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        toolbar.invalidateIntrinsicContentSize()
    }
    

    【讨论】:

    • 在 iOS 9 上运行良好。
    • 这几乎奏效了,我不得不在 invalidateIntrinsicContentSize(); 之后添加 toolbar.sizeToFit();
    【解决方案3】:

    如果您在 NavigationController 中使用 ViewController,则可以使用 NavigationController 的工具栏而不是创建自己的工具栏,并让它处理调整大小。实际上,这就是 ViewController 的 toolbarItems 属性的用途。

    【讨论】:

    • 我知道这个解决方案,但是当你将视图控制器 B 推到视图控制器 A 上时,如果 A 不想要一个工具栏而 B 想要一个工具栏,你就不能得到一个好的 push 水平动画。工具栏动画是垂直的,而推送过渡动画是水平的,所以在我看来它看起来很尴尬。不为工具栏设置动画更糟糕。
    【解决方案4】:

    正如 yonelGeorge 在来自 7KV7 答案的 cmets 中指出的那样,更改自动调整大小掩码在 iOS 5 上无法正常工作。

    我使用-[UIView sizeThatFits:] 方法找到了另一个解决方案。这是我的做法:

    - (void) layoutForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        // Adjust the toolbar height depending on the screen orientation
        CGSize toolbarSize = [self.toolbar sizeThatFits:self.view.bounds.size];
        self.toolbar.frame = (CGRect){CGPointMake(0.f, CGRectGetHeight(self.view.bounds) - toolbarSize.height), toolbarSize};
        self.webView.frame = (CGRect){CGPointZero, CGSizeMake(CGRectGetWidth(self.view.bounds), CGRectGetMinY(self.toolbar.frame))};
    }
    

    然后我在我的视图控制器viewWillAppear:willAnimateRotationToInterfaceOrientation:duration: 方法中调用这个layoutForInterfaceOrientation: 方法。

    高度仍然以编程方式更改,但至少该值不是硬编码的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多