gpt4 book ai didi

iphone - TabBar 应用程序是否需要 shouldAutorotateToInterfaceOrientation 在其所有 viewController 上返回 YES?

转载 作者:行者123 更新时间:2023-11-29 11:18:23 25 4
gpt4 key购买 nike

我正在开发一个以 TabBarController 作为根 Controller 的 iphone 应用程序。并且此根 Controller 与导航 Controller 相关联(每个导航 Controller 都与特定的选项卡栏按钮相关)。

这些导航 Controller 上的一个显示了一些照片,因此我需要启用 Lanscape,这显然在我将此代码添加到所有 View Controller 之前不起作用

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
return YES;
}

但是,现在在所有 View 中都启用了所有方向,一些我不想在横向中显示的 View 非常难看:(

知道如何仅在此照片 View 上保留横向方向并在所有其他 View 上禁用它吗?

最佳答案

考虑以模态方式显示需要完全重新定向功能的 UIViewController。在我看来,这是处理这种情况的常见且正确的方法。

简短地回答您的主题:是的,如果您希望任何选项卡式 viewController 允许重新定向,它确实必须返回 YESUINavigationControllers 堆栈中的 viewControllers 也是如此。因此,这同样适用于它们的任意组合。

摘自 Apple 关于该主题的技术说明:

Why won't my UIViewController rotate with the device?

All child view controllers in your UITabBarController or UINavigationController do not agree on a common orientation set. To make sure that all your child view controllers rotate correctly, you must implement shouldAutorotateToInterfaceOrientation for each view controller representing each tab or navigation level. Each must agree on the same orientation for that rotate to occur. That is, they all should return YES for the same orientation positions.

如果使用模态呈现的 View Controller 不适合您 - 这里有另一种方式......

还有一个可能的解决方案看起来有点“hacky”,但过去对我有用。我将以非常非常“hacky”的方式起草它以简化答案。

在所有 View Controller 的 shouldAutorotateToInterfaceOrientation:toInterfaceOrientation 实现中,返回一个全局值。根据当前显示的 viewController 的需要更改该全局值。尽管据说 viewController 只被询问一次,但这个常见的谣言已被证明对我来说是不正确的。 super 黑客来了;

导航堆栈中的所有 View Controller 都应该像这样实现 shouldAutorotate 方法:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
extern BOOL gSouldAutorotateToAnyOrientationFlag;
if (gShouldAutorotateToAnyOrientationFlag)
{
return YES;
}
return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

现在,在您应用的某处,您应该声明并实例化该全局标志 - 您可以将这个丑陋的全局标志放置在您的应用委托(delegate)实现中,直接位于导入下方和@implementation block 上方:

BOOL gShouldAutorotateToAnyOrientationFlag = NO;

在所有应该仅以纵向模式显示的 viewController 中,将该标志设置为 NO - 例如在 viewWillAppear 内;

- (void)viewWillAppear:(BOOL)animated
{
extern BOOL gShouldAutorotateToAnyOrientationFlag;
gShouldAutorotateToAnyOrientationFlag = NO;
}

在应该以任何方向显示的 viewController/s 中,将该标志设置为 YES - 再次在 viewWillAppear 中;

- (void)viewWillAppear:(BOOL)animated
{
extern BOOL gShouldAutorotateToAnyOrientationFlag;
gShouldAutorotateToAnyOrientationFlag = YES;
}

这样,每当询问整个导航堆栈的方向功能时,都会给出正确的答案。根据我的经验,整个堆栈会被一遍又一遍地询问,答案不会被缓存,因此我的 hack 在我需要的时候起作用了。不过,谣言似乎很普遍,这些答案以某种方式被缓存,因此谣言在某些情况下可能是有效的——因此,如果这对你不起作用(或者甚至被否决:D),我将不承担任何责任

关于iphone - TabBar 应用程序是否需要 shouldAutorotateToInterfaceOrientation 在其所有 viewController 上返回 YES?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8404389/

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