【问题标题】:willTransitionToTraitCollection not called on first change when UISplitViewController preferredDisplayMode is Overlay当 UISplitViewController PreferredDisplayMode 为 Overlay 时,第一次更改时不会调用 willTransitionToTraitCollection
【发布时间】:2017-01-31 04:02:39
【问题描述】:

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

仅在 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 的错误报告者黑洞之前,我想看看是否有人有解释。

【问题讨论】:

    标签: ios objective-c uisplitviewcontroller


    【解决方案1】:

    “这是一个错误”。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这不是真的。 iPhone 仅在横向具有紧凑的宽度和高度,但在纵向具有紧凑的宽度和常规高度,因此在每次设备旋转时都应调用 willTransitionToTraitCollection。此外,如果是这样的话,这将永远不会被调用(如在 iPad 上),但它会在第一个设备旋转之后的每个设备旋转时调用,并且这只发生在我最初描述的情况下。
      • @JordanBondo 你能看看我更新的答案吗
      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 2021-05-31
      • 2018-03-10
      • 1970-01-01
      • 2016-03-20
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多