在iPhone 6 Plus模拟器中具有旋转和分割视图的竞争条件

时间:2015-06-20 17:50:26

标签: ios ios-simulator uisplitviewcontroller iphone-6-plus

我有一个主/详细视图,iPhone底部有一个工具栏,工具栏按钮移动到iPad的导航栏。这是我的代码,用于确定放置它们的位置:

private func isSplit() -> Bool {
    if let svc = self.splitViewController {
        return !svc.collapsed
    }
    else {
        return false
    }
}

func setActionLocation(notification: NSNotification) {
    if self.isSplit() {
        self.toolbarItems = nil
        self.navigationItem.rightBarButtonItems = [self.actionButton, self.deleteButton]
        self.navigationController?.setToolbarHidden(true, animated: false)
    }
    else {
        self.toolbarItems = self.savedToolbar
        self.navigationItem.rightBarButtonItem = nil
        self.navigationController?.setToolbarHidden(false, animated: false)
    }
}

对于iPhone 6 Plus,它是横向分割并以纵向折叠,因此我在设备方向更改时将其注册为通知:

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setActionLocation:", name: UIDeviceOrientationDidChangeNotification, object: nil)

这一切在大多数时候都很好。但是,在模拟器(XCode 6.3.2,iOS模拟器8.3)中,如果我以纵向开始,单击进入详细视图,然后快速(<1秒)旋转到横向,isSplit()仍将返回false和工具栏最终在错误的地方。如果我在旋转之前等待一段时间它可以正常工作。

由于我没有iPhone 6 Plus,我不知道是否在真实硬件中发生这种情况,或者它是否是模拟器的神器。假设它是真的,有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:1)

通过删除轮换通知并在func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController!) -> UIViewController?中实施UISplitViewControllerDelegate,我找到了更好的方法来处理此问题。如果我还在查看主视图,我需要创建一个详细视图控制器并告诉它将图标移到顶部。如果我已经在查看详细视图,我可以告诉该视图将图标移到顶部。旋转代码处理第二种情况但不处理第一种情况,因为细节视图控制器在旋转时不存在,但拆分视图仍然折叠。

另外,这也应该更适合iOS 9分屏多任务处理。