设备旋转时 UIToolbar 的高度

发布于 2024-10-20 13:30:14 字数 861 浏览 2 评论 0原文

根据 iOS 人机界面指南,iOS UI 元素使用指南

在 iPhone 上,考虑 自动改变工具栏高度 发生在设备旋转时。在 特别是,请确保您的定制 工具栏图标非常适合瘦身 横向出现的酒吧 方向。不指定高度 以编程方式创建工具栏。

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

UIToolbar 类参考 不提到高度的自动更改,那么即使 HIG 说不要以编程方式指定工具栏的高度,我是否应该以编程方式更改它?

From the iOS Human Interface Guidelines, iOS UI Element Usage Guidelines

On iPhone, take into account the
automatic change in toolbar height
that occurs on device rotation
. In
particular, make sure your custom
toolbar icons fit well in the thinner
bar that appears in landscape
orientation. Don’t specify the height
of a toolbar programmatically.

I can see the height changing from 44 points to 32 points in Mail, Twitter for iPhone and Dropbox for example, but when I add a toolbar (with Interface Builder) and have my UIViewController subclass to automatically rotate (shouldAutorotateToInterfaceOrientation: returns YES), the toolbar does not automatically change its height on device rotation.

The UIToolbar Class Reference does not mention this automatic change of height, so am I supposed to change it programmatically even though the HIG says Don’t specify the height of a toolbar programmatically?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

恬淡成诗 2024-10-27 13:30:14

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

Did you check the auto-resizing property of the toolbar?

贵在坚持 2024-10-27 13:30:14

正如 yonelGeorge7KV7 答案的评论中指出的,更改自动调整大小蒙版在 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: 方法。

尽管如此,高度仍然以编程方式更改,但至少该值没有被硬编码。

As noted by yonel and George in the comments from 7KV7 answer, changing the autoresizing mask does not work as intended on iOS 5.

I found another solution by using the -[UIView sizeThatFits:] method. Here is how I did it:

- (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))};
}

Then I call this layoutForInterfaceOrientation: method in my view controller viewWillAppear: and willAnimateRotationToInterfaceOrientation:duration: methods.

The height is nonetheless changed programmatically but at least the value is not hardcoded.

神经大条 2024-10-27 13:30:14

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

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

This behavior is a lot simpler to achieve with auto layout. I've only tested in iOS8 but the following code works for me with the desired animation on orientation change:

public override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    toolbar.invalidateIntrinsicContentSize()
}
可是我不能没有你 2024-10-27 13:30:14

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

If you use a ViewController inside a NavigationController, you can use the NavigationController’s toolbar instead of creating your own, and let it handle the resizing. This is what the ViewController's toolbarItems property is for, actually.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文