2017-05-01 8 views
0

Ich habe einen iOS-App in schnellen geschrieben, die den Standard-Navigationsleiste Hintergrund in AppDelegate überschreibt:UINavigationBar Aussehen für UIDocumentInteractionController

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    let navBackgroundImage = UIImage(named: "navBck") 
    UINavigationBar.appearance().barTintColor = UIColor(patternImage: navBackgroundImage) 
} 

In der App das ich verwenden mag ein UIDocumentInteractionController ein PDF zum Anzeigen generiert die App-Datei.

let docInteractionController = UIDocumentInteractionController(url: pdfURL!) 
docInteractionController.delegate = self 
docInteractionController.presentPreview(animated: true) 

Das Problem ist, dass der benutzerdefinierte Hintergrund Ich habe nicht unterstützt scheinen und diese stürzt mit dem folgenden Fehler (die ohne den benutzerdefinierten Hintergrund treten nicht in AppDelegate)

Assertionsfehler in - [ UICGColor encodeWithCoder:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3600.7.47/UIColor.m:1549 Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'Nur RGBA oder Weiße Farbräume werden in dieser Situation unterstützt.

Ich bin auf der Suche nach der saubersten und einfachsten Möglichkeit, dies zu umgehen, indem Sie einen ARGB-Hintergrund nur für diesen Vorgang in der Navigationsleiste wiederherstellen. Ich habe die unten versucht, in meiner UIDocumentInteractionControllerDelegate Implementierung ohne Glück (Abstürze mit dem gleichen Fehler)

func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { 
    UINavigationBar.appearance().barTintColor = UIColor.darkGrey 
    return self 
} 

func documentInteractionControllerDidEndPreview(_ controller: UIDocumentInteractionController) 
{ 
    let navBackgroundImage:UIImage! = UIImage(named: "navBck") 
    UINavigationBar.appearance().barTintColor = UIColor(patternImage: navBackgroundImage) 
} 
+0

Versuchen Sie, die barTintColor vor dem Anzeigen des UIDocumentInteractionController festzulegen. – tmrog

+0

Nur versucht, das gibt den gleichen Fehler – tishu

Antwort

0

Einen Auszug aus der Dokumentation von UIDocumentInteractionControllerDelegate:

// Wenn Vorschau unterstützt wird, dies stellt den View-Controller, auf dem die Vorschau präsentiert wird.

// Diese Methode wird benötigt, wenn die Vorschau unterstützt wird.

// Wenn Sie sich auf einem Navigationsstapel befinden, stellen Sie den Navigationscontroller zur Verfügung, um in einer Weise zu animieren, die mit dem Rest der Plattform übereinstimmt.

@available (iOS 3.2 *)

optional public func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController

Auch in meinem neuen Projekt, habe ich immer navigationController?.navigationBar.barTintColor statt UINavigationBar.appearance().barTintColor verwendet.

EDIT: New Beispiel mit mehr Verständnis für UIDocumentInteractionController

Viewcontroller, der die UIDocumentInteractionController präsentiert

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     navigationController?.navigationBar.barTintColor = getCustomTintColor 
    } 

    func getCustomTintColor() -> UIColor{ 
     let navBackgroundImage:UIImage! = UIImage(named: "navBck") 
     return UIColor(patternImage: navBackgroundImage) 
    } 

    func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { 
     navigationController?.navigationBar.barTintColor = UIColor. darkGrey 
     return navigationController! 
    } 

    func documentInteractionControllerDidEndPreview(_ controller: UIDocumentInteractionController) { 
     navigationController?.navigationBar.barTintColor = getCustomTintColor 
    } 

Um ehrlich zu sein, ich fühle mich auch noch den Absturz wird nicht passieren, wenn Sie

  1. Verwenden Sie navigationController?.navigationBar.barTintColor statt UINavigationBar.appearance().barTintColor
  2. Return Navigation in documentInteractionControllerViewControllerForPreview()

Auf diese Weise wird Ihr Vorschau-Bildschirm hat auch die richtige Tönung. Bitte geben Sie das Bild an, damit ich mein Beispielprojekt einchecken kann (oder überprüfen Sie es in Ihrem Code :)).

+0

UIDocumentInteractionController UIViewController nicht erweitert, so sehe ich nicht, wie navigationController.pushViewController (docInteractionController, animierte: true) kompilieren kann. Ersetze es mit docInteractionController.presentPreview (animiert: true) scheitert nach meinem Kommentar oben – tishu

+0

Mein schlechtes, ich werde den Code in einem Bit bearbeiten – 7to4

+0

In meinem letzten Beispielprojekt, habe ich eine zufällige VC erstellt und überprüft. Jetzt habe ich validiert, indem ich ein pdf geöffnet habe. – 7to4

Verwandte Themen