2016-03-28 3 views
2

ich den Code unten verwenden QLPreviewcontroller zu verwenden, um einige Dokumente in meiner app zu zeigen,Wie kann ich die Freigabe-Schaltfläche in QLPreviewController mithilfe von swift ausblenden?

let ql = QLPreviewController() 
ql.dataSource = self 
//ql.navigationItem.rightBarButtonItems = nil 
ql.navigationItem.rightBarButtonItem = nil 
presentViewController(ql, animated: true, completion: nil) 

Ich möchte nicht auf die Schaltfläche in der rechten oberen QLPreviewcontroller. Ich habe versucht, rightBarButtonItem auf Null zu setzen, aber es funktioniert nicht.

Wie kann ich das verstecken?

+0

Vielleicht können diese helfen: http://stackoverflow.com/questions/22953117/hide-right-button-n-qlpreviewcontroller? – Terry

+0

funktioniert gut für mich https://Stackoverflow.com/a/45344701/1603380 – Buntylm

Antwort

1

Ich weiß, dass dies eine alte Frage ist, aber ich habe so viele Stunden damit verbracht, nach einer Lösung zu suchen und habe etwas gefunden, das funktioniert.

Also, für jeden, der nach dem gleichen Ding wie ich sucht. Hier ist meine Lösung.

Codes sind in Objective-C, aber it'l eine einfache Umstellung auf Swift

Zuerst erstellen wir Unterklasse von QLPreviewController und in der Unterklasse

bearbeiten

Swift die folgenden Methoden außer Kraft gesetzt werden:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationItem.rightBarButtonItem = nil 
    //For ipads the share button becomes a rightBarButtonItem 
    self.navigationController?.toolbar?.isHidden = true 
    //This hides the share item 
    self.navigationController?.toolbar?.addObserver(self, forKeyPath: "hidden", options: NSKeyValueObservingOptionPrior, context: nil) 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    self.navigationController?.toolbar?.removeObserver(self, forKeyPath: "hidden") 
} 

override func observeValue(forKeyPath keyPath: String, ofObject object: Any, change: [AnyHashable: Any], context: UnsafeMutableRawPointer) { 
    var isToolBarHidden: Bool? = self.navigationController?.toolbar?.isHidden 
    // If the ToolBar is not hidden 
    if isToolBarHidden == nil { 
     DispatchQueue.main.async(execute: {() -> Void in 
      self.navigationController?.toolbar?.isHidden = true 
     }) 
    } 
} 

self.navigationController?.pushViewController(qlPreviewController, animated: true) 

Objective-C:

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.navigationItem.rightBarButtonItem = nil; //For ipads the share button becomes a rightBarButtonItem 
    [[self.navigationController toolbar] setHidden:YES]; //This hides the share item 
    [[self.navigationController toolbar] addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionPrior context:nil]; 
} 

Entfernen Sie die Beobachter auf viewWillDisappear

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[self.navigationController toolbar] removeObserver:self forKeyPath:@"hidden"]; 
} 

und den Beobachter Methode: Erforderlich, weil, wenn Sie das Bild einziges Antippen die Navigationsleiste und Werkzeugleiste auszublenden, die Share-Taste auf Hahn wieder sichtbar wird.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 

    BOOL isToolBarHidden = [self.navigationController toolbar].hidden; 
    // If the ToolBar is not hidden 
    if (!isToolBarHidden) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [[self.navigationController toolbar] setHidden:YES]; 
     }); 
    } 
} 

Und die PreviewController hat von Ihnen Navigation

[self.navigationController pushViewController:qlPreviewController animated:YES]; 

bestehenden geschoben werden und müssen wir auch statt QLPreviewController die Unterklasse verwenden.

+0

Funktioniert für mich. Haben Sie eine Möglichkeit gefunden, die gesamte Symbolleiste auch zu verbergen? Dadurch wird nur das Freigabesymbol ausgeblendet. –

+0

Es gibt hier einen Beitrag zu SO [link] (http://stackoverflow.com/questions/15811834/qlpreviewcontroller-hide-bottom-toolbar). Entfernt die Symbolleiste, aber die Schaltfläche zum Teilen wird sichtbar. Überprüfen Sie es und wenn Sie eine Lösung finden, posten Sie bitte auch Ihre Lösung. –

+0

es ist nur ein Problem in IOS 10 scheint es, vielleicht ein Bug, der behoben wird. Vor 10 ist es versteckt. –

2

Keine dieser Lösungen funktionierte für mich in Swift 3 für iOS 10. Das Problem ist, dass die Share-Schaltfläche nach der ViewDidAppear-Methode erstellt wird.

Hier sind die Schritte, die ich folgte die Share-Taste zu entfernen:

1) unterklassiert meine QLPreviewController

2) ein Verfahren Erstellt mein Dokument in dieser Unterklasse zu öffnen:

func show(controller: UIViewController, url: NSURL) { 
    // Refreshing the view 
    self.reloadData() 
    // Printing the doc 
    if let navController = controller.navigationController { 
     navController.pushViewController(self, animated: true) 
    } 
    else { 
     controller.show(self, sender: nil) 
    } 
} 

3) In meinem ViewDidLayoutSubviews habe ich eine Dummy-Schaltfläche erstellt, um die Freigabe-Schaltfläche zu ersetzen:

override func viewDidLayoutSubviews() { 
    navigationItem.rightBarButtonItems?[0] = UIBarButtonItem() 
} 

4) Wenn ich ein Dokument in einem anderen VC öffnen wollen, ich nenne es wie folgt aus:

QLSubclass().show(controller: self, url: path as NSURL) 

Hinweis: Immer nennen es auf diese Weise, und nicht mit einer globalen Variablen Sie instanzierte, weil Sie immer sehen die Share-Taste, bevor es verschwindet.

+0

Sie sind ein genialer Mann.! Es hat für mich funktioniert. Danke vielmals. –

+0

Während dies auf dem iPad funktioniert .. die Freigabe-Taste auf dem iPhone ist nicht auf dem Nabber, sondern auf der Unterseite. Irgendeine Idee, wie man das entfernt? Ich habe versucht, die Schaltfläche in der Symbolleiste zu entfernen, aber die Schaltfläche "share" bleibt weiterhin – spaceMonkey

+0

Eine andere Lösung, die für mich funktionierte, ist, Ihre eigene VC zu erstellen und die Ansicht des QLPreviewControllers als Unteransicht hinzuzufügen, damit Sie die Freigabe loswerden Taste :) –

Verwandte Themen