gpt4 book ai didi

ios - iOS 8 中的 shouldAutorotate 行为

转载 作者:可可西里 更新时间:2023-11-01 03:08:56 25 4
gpt4 key购买 nike

我发现 7.1 和 8 之间的 UIViewController shouldAutorotate 方法有一个小的行为变化。苹果View Controller Programming Guide指出在执行任何自转之前调用此方法

但是我注意到,当我简单地禁用 shouldAutorotate(返回 NO)时,该方法会在纵向 -> 横向旋转时调用,但不会在随后的横向 -> 纵向旋转中调用。同样,按照我的理解,应该始终调用该方法。在 iOS 8 上运行时会发生这种情况,但在 iOS 7.1 上不会。

这似乎与 iOS8 调用堆栈中的一个新方法有关:

[UIWindow shouldAutorotateToInterfaceOrientation:checkForDismissal:isRotationDisabled]

我找不到是否有任何关于此方法及其行为的描述,知道在哪里可以找到有关此内部方法的更多信息吗?

重现这个的简单步骤:

  1. 在 Xcode 中创建一个新的 Single View Application 项目
  2. 更新您的 ViewController.m 以实现 shouldAutorotate

    - (BOOL)shouldAutorotate
    {
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    NSLog(@"%s orientation is %@", __PRETTY_FUNCTION__, [self stringFromDeviceOrientation:orientation]);
    // Disable autorotation of the interface.
    return NO;
    }

    - (NSString *) stringFromDeviceOrientation:(UIDeviceOrientation)uido
    {
    NSString *orientation = @"UIDeviceOrientationUnknown";
    switch (uido) {
    case UIDeviceOrientationPortrait:
    orientation = @"Portrait";
    break;
    case UIDeviceOrientationPortraitUpsideDown:
    orientation = @"PortraitUpsideDown";
    break;
    case UIDeviceOrientationLandscapeRight:
    orientation = @"LandscapeRight";
    break;
    case UIDeviceOrientationLandscapeLeft:
    orientation = @"LandscapeLeft";
    break;
    case UIDeviceOrientationFaceDown:
    orientation = @"FaceDown";
    break;
    case UIDeviceOrientationFaceUp:
    orientation = @"FaceUp";
    break;
    default:
    break;
    }
    return orientation;
    }
  3. 在模拟器 iPhone 5s (7.1) 上运行:shouldAutorotate 在切换到横向和返回纵向时调用

  4. 在模拟器 iPhone 5s (8.0) 或 iPhone 6 上运行:切换到横向时调用 shouldAutorotate,但切换回纵向时不调用

最佳答案

同样的事情发生在我身上。我感觉 iOS8 中存在错误,因为我的相同代码在 iOS7 中运行良好。同样,作为一个用户,我在使用的应用程序中遇到了很多旋转问题。在 8 shouldAutorotate 中,当您旋转到一侧时调用,但当您返回正常旋转时不会再次调用。除非它实际上向侧面进行了自转,在这种情况下返回时会调用它。

这是因为你的“shouldAutorotate”总是返回“NO”。我的假设是,出于某种原因,在 iOS8 中,他们(更改此行为的苹果编码人员)决定,如果他们在旋转到侧面时得到 NO,则在旋转回纵向时不需要调用 shouldAutorotate。所以它打破了我们预期的行为。

没有人谈论它或提示它。对于这种情况,谷歌几乎没有返回任何结果。我认为这是因为为了实现这一点,您必须尝试使用​​“shouldAutorotate”作为设备旋转通知,但实际上并没有使用操作系统的自动旋转功能。比如我做opengl游戏。所以我只是为了让我的引擎知道旋转游戏图形。但我没有改变我的观点。我认为没有多少人将其用于设备轮换通知。

所以我决定改用设备通知。在我的 View Controller 中:

- (void) movingToBackground: (NSNotification *) notification {
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}

- (void) movingToForeground: (NSNotification *) notification {
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}

接收消息:

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewChanging:) name:UIDeviceOrientationDidChangeNotification object:nil];

方法:

- (void)viewChanging:(NSNotification*)notification
{
NSLog(@"View is changing");
previousOrientation = orientation;
orientation = [[UIDevice currentDevice] orientation];

if (previousOrientation==orientation && forceReorientation==NO) {
return;
}
... do stuff ...

然后回到我的 View Controller 中,我将所有自动旋转设置为否。

关于ios - iOS 8 中的 shouldAutorotate 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26503423/

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