Weird display on UIDocumentPickerViewController or UIDocumentBrowserViewController

314 views Asked by At

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?

Demo display on iOS14

View Hierarchy

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
    }
}
0

There are 0 answers