为什么viewWillTransitionToSize ...当displayModeButtonItem触发splitViewController崩溃时没有调用?

时间:2015-08-21 22:36:23

标签: ios button uisplitviewcontroller viewwilltransitiontosize displaymode

我有一个UISplitViewController,其辅助(详细)VC是一个UICollectionViewController。我希望根据集合视图的大小和方面的更改来调整集合的单元格。我通过覆盖UIContentContainer协议方法来触发此调整大小:

// MARK: - UIContentContainer protocol methods

override
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
    setFlowLayoutItemSizeForViewSize(size)
    collectionViewLayout.invalidateLayout()
}

这被称为并且在设备旋转时正常工作;但是当按下splitViewController?.displayModeButtonItem()提供的按钮以显示或折叠主(主)视图控制器时,此方法 not 被调用。由于崩溃必然会改变辅助(细节)视图的大小,我应该在触发时调用viewWillTransitionToSize ...方法。

所以,有两个问题:

1)当按下displayModeButtonItem时,是否应该调用viewWillTransitionToSize ...方法?如果是这样,我似乎发现了一个错误。

2)如果我所看到的事实上是正确的行为,那么任何人都可以为我的辅助(细节)控制器建议一种方式来了解"知道"是在按下displayModeButtonItem时,还是由于按下该按钮而导致其大小发生变化?

谢谢!

卡尔

3 个答案:

答案 0 :(得分:2)

1)不是错误; displayModeChange未被sizeTransition视为

2)你的UISplitviewController很可能已经有了一个可以实现可选的UISplitViewControllerDelegate:

splitViewController(_ svc: UISplitViewController,
      willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode)

将使用UISplitViewControllerDisplayModePrimaryHiddenUISplitViewControllerDisplayModeAllVisible调用的方法,具体取决于splitView切换到的模式。

答案 1 :(得分:0)

我解决这个问题的方法是继承const schema = { name: value => /^([A-Z][a-z\-]* )+[A-Z][a-z\-]*( \w+\.?)?$/.test(value), age: value => parseInt(value) === Number(value) && value >= 18, phone: value => /^(\+?\d{1,2}-)?\d{3}-\d{3}-\d{4}$/.test(value) }; schema.name.required = true; schema.age.required = true; let info = { // name: 'John Doe', age: '', phone: '123-456-7890' }; const validate = (object, schema) => Object .entries(schema) .map(([property, validate]) => [ property, !validate.required || (property in object), validate(object[property]) ]).reduce((errors, [property, canValidate, isValid]) => { if (!canValidate) { errors.push(new Error(`${property} is required.`)); } else if (canValidate && !isValid) { errors.push(new Error(`${property} is invalid.`)); } return errors; }, []); const errors = validate(info, schema); if (errors.length > 0) { for (const { message } of errors) { console.log(message); } } else { console.log('info is valid'); }并覆盖UISplitViewController,如下所示:

viewWillTransitionToSize(...)

希望它有所帮助!

答案 2 :(得分:0)

对此有一个内置通知:

// Sometimes view controllers that are using showViewController:sender and showDetailViewController:sender: will need to know when the split view controller environment above it has changed. This notification will be posted when that happens (for example, when a split view controller is collapsing or expanding). The NSNotification's object will be the view controller that caused the change.
UIKIT_EXTERN NSNotificationName const UIViewControllerShowDetailTargetDidChangeNotification NS_AVAILABLE_IOS(8_0);

有关使用方法,请参见Apple的AdaptivePhotos示例。