willTransitionToTraitCollection 在 UISplitViewController preferredDisplayMode 为 Overlay 时不会在第一次更改时调用

willTransitionToTraitCollection not called on first change when UISplitViewController preferredDisplayMode is Overlay

我正在使用 UISplitViewController 并且在我的详细视图中,我正在尝试使用 willTransitionToTraitCollection:withTransitionCoordinator: 在垂直大小 class 更改为紧凑时更改几个视图的可见性。

仅在 iPhone 上(不是 iPhone Plus 或 iPad)如果我将 preferredDisplayMode 更改为 UISplitViewControllerDisplayModePrimaryOverlay,则 willTransitionToTraitCollection:withTransitionCoordinator: 是第一次旋转设备时不调用,但 willTransitionToSize:withTransitionCoordinator: 是。如果我将 preferredDisplayMode 设置为任何其他值,它就可以正常工作。如果您在选择主列表中的项目之前旋转设备,它就可以正常工作。仅在从纵向到横向的第一次旋转时。

这很容易使用 Master-Detail 模板复制:

AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;

    // ******** Add this ********
    [splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryOverlay];

    UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
    splitViewController.delegate = self;
    return YES;
}

DetailViewController中,添加viewWillTransitionToTraitCollectionviewWillTransitionToSize实现并设置断点:

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
}

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

您会看到 willTransitionToSize: 总是被调用,但 willTransitionToTraitCollection: 不会在第一次转换时被调用。

有人知道这是为什么吗?我觉得这是一个错误,但在我向 Apple 的错误报告程序黑洞发送错误报告之前,我想看看是否有人有解释。

"this is a bug"。

我已向 Apple 提交错误报告并为其创建雷达:https://openradar.appspot.com/radar?id=5015544713445376

setPreferredDisplayMode 使所有视图加载,因此您应该最后调用它。