Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIDocumentPicker navigation bar buttons are hidden at iOS 11

I notice a problem in my UIDocumentPicker's navigation bar at iOS 11 only, the done, cancel, or edit buttons are invisible, and when the user touch it it appears i.e. The color at normal state is white, even when changing the UINavigationBar.appearnce().tintColor, The color only changed on touch.

enter image description here enter image description here

like image 745
Ahmed Adnan Qazzaz Avatar asked Nov 26 '17 12:11

Ahmed Adnan Qazzaz


3 Answers

For unknown reason I figured out that if you make a subclass of UIDocumentPicker using Objective-C and set the [UINavigationBar appearance].tintColor = [UIColor black]; in viewWillAppear func, and reset it to your defaults in the viewWillDisappear, it works well.

But if you do the same steps using swift it wont.

like image 75
Ahmed Adnan Qazzaz Avatar answered Nov 18 '22 10:11

Ahmed Adnan Qazzaz


I'm not a big fan of setting the global appearance between viewWillAppear and viewWillDisappear. The appearance API should be used at application start only. You can just reset the appearance for UIDocumentPickerViewController only without subclassing by putting this code in application:didFinishLaunchingWithOptions: and the bar buttons will return the their original blue:

if #available(iOS 11.0, *) {
    UINavigationBar.appearance(whenContainedInInstancesOf: [UIDocumentBrowserViewController.self]).tintColor = nil
}
like image 20
Antoine Lamy Avatar answered Nov 18 '22 11:11

Antoine Lamy


Use CustomDocumentPickerViewController with black appearance for UINavigationBar and UIBarButtonItem

import UIKit

class CustomDocumentPickerViewController: UIDocumentPickerViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        UINavigationBar.appearance().tintColor = UIColor.black
        UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.black], for: .normal)
    }

    override func viewWillDisappear(_ animated: Bool) {

        UINavigationBar.appearance().tintColor = UIColor.white // your color
        UIBarButtonItem.appearance().setTitleTextAttributes(nil, for: .normal)
        super.viewWillDisappear(animated)

    }

}
like image 3
Evgeny Karev Avatar answered Nov 18 '22 10:11

Evgeny Karev