2015-01-07 6 views
18

Ich habe eine Anwendung, die sowohl mit iPhone-und iPad-Layouts kompatibel ist. Für iPhone Layout habe ich Action Sheet und Popover für iPad erstellt. Das Problem ist, dass der Popover-Pfeil nicht über die Schaltfläche, auf die ich geklickt habe, zeigt. Unten ist mein Code ....Pop-Over zeigt nicht über die Schaltfläche

let actionSheet = UIAlertController(title: "Choose an option", 
      message: "Message", 
      preferredStyle: .ActionSheet) 
... 

if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad 
{ 
    // for iPad 
    actionSheet.popoverPresentationController?.sourceView = self.view 
    actionSheet.popoverPresentationController?.sourceRect = self.view.bounds; 
    actionSheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.allZeros; 
} 

self.presentViewController(actionSheet, animated: true, completion: nil) 

Antwort

69

die sourceView und sourceRect als button und button.bounds Set.
Sie können die zulässigenArrowDirections abhängig vom Layout Ihrer Ansicht auswählen.

actionSheet.popoverPresentationController?.sourceView = button 
actionSheet.popoverPresentationController?.sourceRect = button.bounds; 
actionSheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.Left; 

Wenn die Schaltfläche ein BarButtonItem ist, verwenden Sie diesen Code.

actionSheet.popoverPresentationController?.barButtonItem = button 
actionSheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.Up; 
+0

Ok, die nicht funktionierten entweder. Die Schaltfläche ist eigentlich ein 'UIBarButtonItem'. Ich habe die Funktion geändert als '@IBAction func userOptions (button: UIBarButtonItem)' und es warf einen Fehler: '[UIBarButtonItem Grenzen]: unerkannter Selektor gesendet ' –

+0

Überprüfen Sie meine modifizierte Antwort @SrujanSimha – rakeshbs

+0

Perfekt! Danke Mann :) –

2

Für mich arbeitete mit dem Absender und Casting als UIView.

alertController.popoverPresentationController?.sourceView = sender as! UIView 
alertController.popoverPresentationController?.sourceRect = sender.bounds 

alertController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.Up 
0

SWIFT 3

Dieser arbeitete für mich, wenn meine Taste ein UIBarButtonItem war:

if UIDevice.current.userInterfaceIdiom == .pad { 

    if controller.responds(to: "popoverPresentationController") { 
     controller.popoverPresentationController?.barButtonItem = YourUIBarButtonName 
    } 

} 

Schnipsel Entire Code unten:

func presentActivitySheet() { 

    let controller = UIActivityViewController(activityItems: [document.fileURL], applicationActivities: nil) 

     if UIDevice.current.userInterfaceIdiom == .pad { 

      if controller.responds(to: "popoverPresentationController") { 
      controller.popoverPresentationController?.barButtonItem = YourUIBarButtonName 
      } 

     } 

    present(controller, animated: true, completion: nil) 
} 
Verwandte Themen