我希望從UIButton
創建一個關於50x50px
的小彈出窗口。我已經看到了使用自適應segue的方法,但是我有我的尺寸類別,因此我不能使用這個功能!從Swift中的UIButton創建彈出窗口
我該怎樣創建這個彈出窗口?我可以用我的按鈕IBACtion
內的代碼創建它嗎?或者還有一種方法可以用故事板做到這一點?
我希望從UIButton
創建一個關於50x50px
的小彈出窗口。我已經看到了使用自適應segue的方法,但是我有我的尺寸類別,因此我不能使用這個功能!從Swift中的UIButton創建彈出窗口
我該怎樣創建這個彈出窗口?我可以用我的按鈕IBACtion
內的代碼創建它嗎?或者還有一種方法可以用故事板做到這一點?
你可以做以下兩個選項之一:
創建您的UIViewController
的UIButton
的動作和內呈現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
。
我希望這對你有所幫助。
在這裏,您可以在按鈕單擊時彈出一個彈出窗口。
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)
}
斯威夫特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標識符關注。
希望有幫助!
感謝您的支持!第一個例子很有效,但它似乎在改變大小。 popover只是全屏顯示。 我認爲你解釋的第二種方式將是一個更好的方法..但我再次遇到錯誤無法遵守連接IBCocoaTouchoutlet錨查看。 你可以給我一些代碼,以解釋你的第二種方式嗎? – user4671001 2015-03-21 20:34:20
@ user4671001我不明白,在第二種方式中,你不需要設置anchoView爲空 – 2015-03-23 14:57:45
彈出窗口顯示爲全屏模式的iphones,你可以通過添加這個函數來禁用它:'func adaptivePresentationStyleForPresentationController(PC:UIPresentationController!) - > UIModalPresentationStyle {//這個*強制*在iPhone上顯示彈出窗口 return。無 }' – user1076813 2015-05-26 03:23:25