在拆分视图旋转上手动设置preferredDisplayMode时,主视图控制器内容消失

时间:2015-01-14 22:21:34

标签: ios8 rotation uisplitviewcontroller

我在iOS 8中有一个自定义的UISplitViewController子类。在横向中我想要显示主要和辅助VC的默认行为(preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible),但是当我旋转到肖像时我想要主VC显示在默认弹出窗口(preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay)中。

通过在子类上实现-viewWillTransitionToSize:,我可以使其工作,但在旋转几次后,主VC消失,直到我点击拆分视图的栏按钮项后才会重新出现。< / p>

在第一对旋转中旋转动画完成块中的日志显示首选显示模式与实际显示模式相同,但在几次旋转后,实际显示模式在景观中被卡住为UISplitViewControllerDisplayModePrimaryOverlay,即使首选显示模式为UISplitViewControllerDisplayModeAllVisible

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

    if (self.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
        BOOL isPortrait = size.height > size.width;

        if (isPortrait) {
            self.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
        }
        else {
            self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
        }

        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            self.dividerView.hidden = isPortrait;
        } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            NSLog(@"Preferred display mode: %ld | Actual display mode: %ld", self.preferredDisplayMode, self.displayMode);
        }];
    }
}

1 个答案:

答案 0 :(得分:2)

感谢https://devforums.apple.com/message/1024928#1024928我明白了。

在动画协调器的完成块中,将preferredDisplayMode设置为UISplitViewControllerDisplayModeAutomatic使其工作。

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

    if (self.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
        BOOL isPortrait = size.height > size.width;

        if (isPortrait) {
            self.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
        }

        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            if (isPortrait) {
                self.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
            }
            self.dividerView.hidden = isPortrait;
        } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            // ADD THIS TO THE COMPLETION BLOCK
            self.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic;

            NSLog(@"Preferred display mode: %ld | Actual display mode: %ld", self.preferredDisplayMode, self.displayMode);
        }];
    }
}