gpt4 book ai didi

iPhone 横屏常见问题及解决方案

转载 作者:行者123 更新时间:2023-12-03 18:20:50 31 4
gpt4 key购买 nike

关于如何实现对横向/纵向模式自动旋转进行正确处理的 iPhone 应用程序,这里存在很多困惑和一系列相应的问题。当需要以横向模式启动时,实现这样的应用程序尤其困难。最常见的观察到的效果是困惑的布局和不再识别触摸的屏幕区域。

简单搜索标记为 iphonelandscape 的问题即可发现这些问题,这些问题会在某些情况下发生:

已经提出了一组不同的解决方案,其中一些包括通过 CoreGraphics 完全自定义的动画,而其他解决方案则基于从主 Nib 加载的第一个 View Controller 始终显示正确的观察结果。

我花了大量时间调查这个问题,最终找到了一个解决方案,该解决方案不仅是部分解决方案,而且应该在所有这些情况下都有效。我写这篇 CW 文章的目的是为其他在横向模式下遇到 UIViewControllers 问题的人提供常见问题解答。

请提供反馈并通过纳入任何相关观察结果来帮助提高本文的质量。如果您知道的话,请随意编辑并发布其他/更好的答案。

最佳答案

documentation 中有什么:

在你的 View Controller 中,重写shouldAutorotateToInterfaceOrientation:来声明你支持的界面方向。每次设备方向发生变化时, Controller 基础设施都将/应该检查此属性。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
return (orientation == UIInterfaceOrientationLandscapeRight);
}

这是 View Controller 需要做的绝对最少的事情。如果您想以横向模式启动应用程序,则需要将以下 key 添加到您的 .plist 文件中:

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

Apple 建议在横向右模式下启动仅限横向的应用程序(请参阅“用户体验指南”>“立即启动”下的 the HIG)。

文档中未包含的内容:

一些背景:

每次您尝试加载与从主 Nib 加载的 View Controller 不同的 View Controller 时,您的 View Controller 既不会询问其支持的界面方向,也不会正确设置其框架。只有绑定(bind)到窗口的第一个 View Controller 才会正确布局。

其他人建议使用连接到主窗口的“MasterViewController”,其他 Controller 将其 View 添加为 subview ,而不是直接连接到窗口。虽然我发现此解决方案是一个可行的选择,但在将模态视图 Controller 添加到这些 subview 的情况下,它无法正常工作。如果您有一些 subview 应该能够自动旋转(主 Controller 将阻止),那么也会出现问题。

使用未记录的 API 来强制特定的界面方向也不是一种选择。

解决方案:

到目前为止,我发现的最佳解决方案是对“MasterViewController”解决方法的修改。不使用自定义的“MasterViewController”,而是使用带有隐藏导航栏和隐藏选项卡栏的 UINavigationController。如果从该 Controller 的导航堆栈中推送/弹出所有其他 View ,则该堆栈上 Controller 的自动旋转将得到正确管理。

通过 presentModalViewController:animated:UINavigationController 导航堆栈上的任何 View Controller 呈现的模态 Controller 都将旋转并以正确的布局呈现。如果您希望模态视图 Controller 可旋转到与父 View Controller 不同的方向,则需要从 parentshouldAutorotateToInterfaceOrientation 方法返回所需的方向呈现模态视图时的 Controller 。为了在模态 Controller 关闭时正确恢复界面方向,您需要在调用 dismissModalViewController:animated: 之前确保 shouldAutorotateToInterfaceOrientation 返回父 Controller 所需的方向。 。您可以在 View Controller 上使用私有(private) BOOL 来管理它(例如 BOOL isModalMailControllerActive_)。

我很快就会添加一段示例代码,现在已经晚了。如果这篇文章还有任何 Unresolved 问题或有任何不清楚的地方,请告诉我。请随意编辑和改进。

关于iPhone 横屏常见问题及解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2953351/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com