设备旋转时UIToolbar的高度

15

根据iOS人机界面设计指南,iOS用户界面元素使用指南

在 iPhone 上,考虑设备旋转时工具栏高度的自动更改。特别是,请确保您自定义的工具栏图标适合以横向显示时出现的较细的栏中。不要编程指定工具栏的高度。

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

UIToolbar类参考文档没有提及这种高度的自动更改,因此我是否应该编程更改它,即使HIG说不要编程指定工具栏的高度

4个回答

19

你有检查工具栏的自动调整大小属性吗?


11
这就是了,你需要在程序中这样做:toolbar.autoresizingMask = toolbar.autoresizingMask | UIViewAutoresizingFlexibleHeight; 因为Interface Builder不允许你改变高度的可伸缩性! - 0xced
2
你使用这个解决方案时,iOS5.0 会有副作用吗?它能正常工作,但工具栏中的图标始终是横向(较小)大小,即使在纵向模式下也是如此 :/ - yonel
我支持yonel的观点 - 图标在两个方向上保持小尺寸。而且,一旦旋转,它并没有正确地定位 - 屏幕底部会多出一个未覆盖的像素。我想知道为什么IB中调整大小掩码被禁用了... - George
我认为你看到的像素问题和图标大小问题有两个原因。首先,像素问题是因为你的struts没有正确设置在工具栏上方/下方的视图中。其次,图标大小问题可能是因为你在viewDidLoad方法中调整了autoresizingMask。尝试在viewWillAppear方法中进行调整。这样做对我在iOS 6中的预期效果起作用。 - lehn0058
@0xced,你可以在Interface Builder中找到自动调整大小掩码。只需转到“大小”选项卡,您将在左侧看到“自动调整大小”框。 - Ege Akpinar

15

正如在7KV7的回答中由yonelGeorge在评论中指出的那样,更改自动调整大小掩码在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:方法。

高度仍然是通过编程方式改变的,但至少值不是硬编码的。


12

使用自动布局实现这种行为要简单得多。我只在iOS8上进行了测试,但以下代码对于我来说可以在方向更改时以所需的动画效果工作:

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

在iOS 9上运行良好。 - Rudolf Adamkovič
这个几乎可以工作了,但在 invalidateIntrinsicContentSize() 后我必须添加 toolbar.sizeToFit()。 - C0C0AL0C0

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

1
我知道这个解决方案,但是当你将视图控制器B推到视图控制器A上时,如果A不想要工具栏而B想要工具栏,你就无法得到一个漂亮的水平动画。 工具栏动画是垂直的,而推过渡动画是水平的,所以在我看来,它看起来很尴尬。 不播放工具栏动画甚至更糟。 - 0xced

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接