I recently got stuck on an UI problem that UIDocumentPickerViewController
doesn't show correctly. See the picture below.
Also, I tried UIDocumentBrowserViewController
, got the same result.
Has anyone encountered this problem?
Code:
extension UIDocumentPickerViewController {
private static weak var instance: UIDocumentPickerViewController?
private static var completion: (([URL]?)->Void)?
@objc public class func show(on viewController: UIViewController, supportedDocumentTypes: [String]?, completion: @escaping ([URL]?)->Void) {
var vc: UIDocumentPickerViewController?
if #available(iOS 14.0, *) {
var types = [UTType]()
if let supportedDocumentTypes = supportedDocumentTypes {
supportedDocumentTypes.forEach { (typeString) in
if let type = UTType(typeString) {
types.append(type)
}
}
} else {
types.append(.pdf)
if let type = UTType("com.microsoft.word.doc") {
types.append(type)
}
if let type = UTType("com.microsoft.excel.xls") {
types.append(type)
}
if let type = UTType("com.microsoft.powerpoint.ppt") {
types.append(type)
}
if let type = UTType("org.openxmlformats.wordprocessingml.document") {
types.append(type)
}
if let type = UTType("org.openxmlformats.presentationml.presentation") {
types.append(type)
}
if let type = UTType("org.openxmlformats.spreadsheetml.sheet") {
types.append(type)
}
}
vc = UIDocumentPickerViewController(forOpeningContentTypes: types, asCopy: true)
} else {
var types = [String]()
if let solidInputTypes = supportedDocumentTypes {
types.append(solidInputTypes)
} else {
types.append([ "com.adobe.pdf",
"com.microsoft.word.doc",
"com.microsoft.excel.xls",
"com.microsoft.powerpoint.ppt", "org.openxmlformats.wordprocessingml.document",
"org.openxmlformats.presentationml.presentation",
"org.openxmlformats.spreadsheetml.sheet" ])
}
vc = UIDocumentPickerViewController(documentTypes: types, in: .open)
}
guard let documentPicker = vc else { return }
documentPicker.allowsMultipleSelection = true
documentPicker.modalPresentationStyle = .fullScreen
documentPicker.delegate = vc
UIDocumentPickerViewController.completion = completion
UIDocumentPickerViewController.instance = vc
viewController.present(documentPicker, animated: true, completion: nil)
}
}
extension UIDocumentPickerViewController: UIDocumentPickerDelegate {
public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
UIDocumentPickerViewController.completion?(urls)
UIDocumentPickerViewController.completion = nil
}
public func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
UIDocumentPickerViewController.completion?(nil)
UIDocumentPickerViewController.completion = nil
}
}