我有一个依赖Xamarin.IOS的应用程序。在某个时刻,它可以将文档选择器显示为popover。在更新到XCode14并为iOS16进行构建后,我发现文档选择器显示不正确(以其FormSheet样式而不是Popover样式(。
造成这种情况的原因似乎是,尝试更改ModalPresentationStyle失败了,并保留为相同的默认值FormSheet。
在一个简单的测试应用程序中,用一个按钮点击处理程序在应用程序之外复制它。在这里,我希望ModalPresentationStyle会更改,或者如果不支持,至少会引发某种错误。相反,它保持为UIModalPresentationStyle.FormSheet.
partial void BtnClick(UIKit.UIButton sender)
{
var allowedUtis = new List<string>() { ".txt" };
var documentPicker = new UIDocumentPickerViewController(
allowedUtis.ToArray(),
UIDocumentPickerMode.Import);
var previousValue = documentPicker.ModalPresentationStyle;
documentPicker.ModalPresentationStyle = UIModalPresentationStyle.Popover;
Debug.WriteLine($"Changed from {previousValue} to {documentPicker.ModalPresentationStyle}");
if (documentPicker.PopoverPresentationController != null)
{
documentPicker.PopoverPresentationController.SourceView = sender;
documentPicker.PopoverPresentationController.SourceRect = sender.Bounds;
documentPicker.PopoverPresentationController.PermittedArrowDirections = UIPopoverArrowDirection.Up;
}
PresentModalViewController(documentPicker, true);
}
在swift的一个测试应用程序中也复制了同样的行为,以检查问题不是Xamarin.IOS。这里,modalPresentationStyle的值仍然为.formSheet(2(。
let supportedTypes: [UTType] = [UTType.audio]
let pickerViewController = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true) 1017
print(String(describing: pickerViewController.modalPresentationStyle));
pickerViewController.modalPresentationStyle = .popover
print(String(describing: pickerViewController.modalPresentationStyle));
self.present(pickerViewController, animated: true, completion: {})
这在XCode13上没有发生,但在运行iOS 16.1的第八代iPad上的XCode14.01上发生了。
无法在XCode14.01上使用运行iOS 16.0的模拟器进行复制。
预期行为是否发生了变化?我在文档的发行说明中似乎找不到任何关于这方面的内容。
我最近也遇到了同样的基本问题。解决方案是在呈现模态视图控制器之后设置popoverPresentationController
。
let supportedTypes: [UTType] = [UTType.audio]
let pickerViewController = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true) 1017
print(String(describing: pickerViewController.modalPresentationStyle));
pickerViewController.modalPresentationStyle = .popover
print(String(describing: pickerViewController.modalPresentationStyle));
self.present(pickerViewController, animated: true)
pickerViewController.popoverPresentationController?.sourceRect = sender.bounds
pickerViewController.popoverPresentationController?.sourceView = sender
pickerViewController.popoverPresentationController?.permittedArrowDirections = .up
视图控制器的popoverPresentationController
在调用present
之前是nil
。至少在iOS 16下是这样。
虽然我没有用UIDocumentPickerViewController
专门测试这一点,但这个解决方案适用于我试图展示的通用模态视图控制器。如果popoverPresentationController
是在调用present
之前而不是之后设置的,则视图控制器将显示为表单,尽管设置为popover。