iOS 11 UIImagePickerController 奇怪的问题
iOS 11 UIImagePickerController strange issue
我正在使用 UIImagePickerController select 来自照片库的单个图像。 iPad 在横向模式下出现一个奇怪的问题。
图像选择器是按照建议在 iPad 上使用 UIPopoverPresentationController 呈现的。首次呈现时,状态栏正确:
但是,当进入照片库的第二层时,状态栏变为纵向模式:
到目前为止我注意到的是:
- 此问题仅出现在 iOS 11,而不是 iOS 10。
- 发生这种情况时,将 iPad 旋转为纵向并返回横向将修复状态栏方向。
- 这只是在第一次展示选择器控制器时发生的。
- 如果忽略,呈现其他模态视图将以纵向模式显示:
呈现uiimagepickerController的代码如下:
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.modalPresentationStyle = UIModalPresentationPopover;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
UIPopoverPresentationController *popupController = picker.popoverPresentationController;
if (popupController) {
popupController.barButtonItem = sender;
}
知道我哪里做错了吗,或者这是一个错误?
整个示例项目可以在这里下载:
https://www.dropbox.com/s/zgipclyr0mz26c6/test.zip?dl=0
我终于找到问题的原因了。
我的应用需要在 iPad 上支持所有方向,仅在 iPhone 上支持纵向模式。因此我添加了以下 UIApplicationDelegate 代码:
- (UIInterfaceOrientationMask) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (window.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
但有时它会给我 nil window,例如在 iPad 上使用 UIPopoverPresentationController 呈现的 UIImagePickerController 的情况,并且 return UIInterfaceOrientationMaskPortrait 并导致状态栏旋转到纵向模式.我还注意到只有在选中 UIRequiresFullScreen 时才会发生这种情况。
我已经通过检查 window 不是 nil 解决了我的问题,如下所示:
- (UIInterfaceOrientationMask) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (window) {
if (window.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
return UIInterfaceOrientationMaskAll;
} else {
return UIInterfaceOrientationMaskPortrait;
}
} else {
return UIInterfaceOrientationMaskAll;
}
}
我正在使用 UIImagePickerController select 来自照片库的单个图像。 iPad 在横向模式下出现一个奇怪的问题。
图像选择器是按照建议在 iPad 上使用 UIPopoverPresentationController 呈现的。首次呈现时,状态栏正确:
但是,当进入照片库的第二层时,状态栏变为纵向模式:
到目前为止我注意到的是:
- 此问题仅出现在 iOS 11,而不是 iOS 10。
- 发生这种情况时,将 iPad 旋转为纵向并返回横向将修复状态栏方向。
- 这只是在第一次展示选择器控制器时发生的。
- 如果忽略,呈现其他模态视图将以纵向模式显示:
呈现uiimagepickerController的代码如下:
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.modalPresentationStyle = UIModalPresentationPopover;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
UIPopoverPresentationController *popupController = picker.popoverPresentationController;
if (popupController) {
popupController.barButtonItem = sender;
}
知道我哪里做错了吗,或者这是一个错误?
整个示例项目可以在这里下载: https://www.dropbox.com/s/zgipclyr0mz26c6/test.zip?dl=0
我终于找到问题的原因了。
我的应用需要在 iPad 上支持所有方向,仅在 iPhone 上支持纵向模式。因此我添加了以下 UIApplicationDelegate 代码:
- (UIInterfaceOrientationMask) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (window.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
但有时它会给我 nil window,例如在 iPad 上使用 UIPopoverPresentationController 呈现的 UIImagePickerController 的情况,并且 return UIInterfaceOrientationMaskPortrait 并导致状态栏旋转到纵向模式.我还注意到只有在选中 UIRequiresFullScreen 时才会发生这种情况。
我已经通过检查 window 不是 nil 解决了我的问题,如下所示:
- (UIInterfaceOrientationMask) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (window) {
if (window.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
return UIInterfaceOrientationMaskAll;
} else {
return UIInterfaceOrientationMaskPortrait;
}
} else {
return UIInterfaceOrientationMaskAll;
}
}