2015-03-18 48 views
9

我希望從UIButton創建一個關於50x50px的小彈出窗口。我已經看到了使用自適應segue的方法,但是我有我的尺寸類別,因此我不能使用這個功能!從Swift中的UIButton創建彈出窗口

我該怎樣創建這個彈出窗口?我可以用我的按鈕IBACtion內的代碼創建它嗎?或者還有一種方法可以用故事板做到這一點?

回答

9

你可以做以下兩個選項之一:

  • 創建您的UIViewControllerUIButton的動作和內呈現ViewController你要像酥料餅和你UIViewController必須實現協議UIPopoverPresentationControllerDelegate,採取下面的代碼一看:

    @IBAction func showPopover(sender: AnyObject) { 
    
        var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("StoryboardIdentifier") as! UIViewController 
    
        popoverContent.modalPresentationStyle = .Popover 
        var popover = popoverContent.popoverPresentationController 
    
        if let popover = popoverContent.popoverPresentationController { 
    
         let viewForSource = sender as! UIView 
         popover.sourceView = viewForSource 
    
         // the position of the popover where it's showed 
         popover.sourceRect = viewForSource.bounds 
    
         // the size you want to display 
         popoverContent.preferredContentSize = CGSizeMake(200,500) 
         popover.delegate = self 
        }    
    
        self.presentViewController(popoverContent, animated: true, completion: nil) 
    } 
    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
        return .None 
    } 
    

    根據這本書@馬特編程的iOS 8

    甲酥料餅呈現控制器,在IOS 8,是表示控制器(UIPresentationController),和呈現控制器是自適應的。這意味着,默認情況下,在水平緊湊的環境中(即在iPhone上),.Popover模式演示樣式將被視爲.FullScreen。在iPad上顯示爲彈出窗口的內容將作爲iPhone上全屏顯示的視圖顯示,完全取代界面。

    爲了避免這種情況的iPhone,你需要實現你的UIViewController裏面的委託方法adaptivePresentationStyleForPresentationController正確顯示酥料餅。

  • 在我看來,另一種方式是更容易做到,並且使用Interface Builder,從UIButton只是安排創建一個順着接下去你想和在SEGUE選擇Popover SEGUE的ViewController

我希望這對你有所幫助。

+0

感謝您的支持!第一個例子很有效,但它似乎在改變大小。 popover只是全屏顯示。 我認爲你解釋的第二種方式將是一個更好的方法..但我再次遇到錯誤無法遵守連接IBCocoaTouchoutlet錨查看。 你可以給我一些代碼,以解釋你的第二種方式嗎? – user4671001 2015-03-21 20:34:20

+0

@ user4671001我不明白,在第二種方式中,你不需要設置anchoView爲空 – 2015-03-23 14:57:45

+2

彈出窗口顯示爲全屏模式的iphones,你可以通過添加這個函數來禁用它:'func adaptivePresentationStyleForPresentationController(PC:UIPresentationController!) - > UIModalPresentationStyle {//這個*強制*在iPhone上顯示彈出窗口 return。無 }' – user1076813 2015-05-26 03:23:25

1

在這裏,您可以在按鈕單擊時彈出一個彈出窗口。

func addCategory(_ sender : UIButton) { 

     var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController 
     var nav = UINavigationController(rootViewController: popoverContent) 
     nav.modalPresentationStyle = UIModalPresentationStyle.Popover 
     var popover = nav.popoverPresentationController 
     popoverContent.preferredContentSize = CGSizeMake(50,50) 
     popover.delegate = self 
     popover.sourceView = sender 
     popover.sourceRect = sender.bounds 

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

    } 
0

斯威夫特4這裏是完全工作的代碼。所以,在這裏你會看到彈出窗口的大小250x250的:

import UIKit 

    class ViewController: UIViewController { 

     @IBOutlet weak var button: UIButton! 

     override func viewDidLoad() { 
      super.viewDidLoad() 

// in case if you don't want to make it via IBAction 
      button.addTarget(self, action: #selector(tapped), for: .touchUpInside) 
     } 

     @objc 
     private func tapped() { 

      guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") else { return } 

      popVC.modalPresentationStyle = .popover 

      let popOverVC = popVC.popoverPresentationController 
      popOverVC?.delegate = self 
      popOverVC?.sourceView = self.button 
      popOverVC?.sourceRect = CGRect(x: self.button.bounds.midX, y: self.button.bounds.minY, width: 0, height: 0) 
      popVC.preferredContentSize = CGSize(width: 250, height: 250) 

      self.present(popVC, animated: true) 
     } 
    } 


// This is we need to make it looks as a popup window on iPhone 
    extension ViewController: UIPopoverPresentationControllerDelegate { 

     func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { 
      return .none 
     } 
    } 

考慮到,你必須提供一個的viewController要表現爲一個彈出popVC標識符關注。

希望有幫助!