我有一个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时,还是由于按下该按钮而导致其大小发生变化?
谢谢!
卡尔
答案 0 :(得分:2)
1)不是错误; displayModeChange未被sizeTransition视为
2)你的UISplitviewController很可能已经有了一个可以实现可选的UISplitViewControllerDelegate:
splitViewController(_ svc: UISplitViewController,
willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode)
将使用UISplitViewControllerDisplayModePrimaryHidden
或UISplitViewControllerDisplayModeAllVisible
调用的方法,具体取决于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示例。