UIButton
から50x50px
に関する小さなポップオーバーを作成したいと思います。アダプティブセグエを使用するメソッドを見てきましたが、サイズクラスがオンになっているため、この機能を使用できません。
他にどのようにこのポップオーバーを作成できますか?ボタンIBACtion
内のコードで作成できますか?それとも、ストーリーボードでこれを行う方法はまだありますか?
次の2つのオプションのいずれかを実行できます。
UIButton
にUIViewController
のアクションを作成し、ポップオーバーのような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
}
@mattの本によるとプログラミングiOS 8:
IOS 8のポップオーバープレゼンテーションコントローラーはプレゼンテーションコントローラー(
UIPresentationController
)であり、プレゼンテーションコントローラーは適応型です。つまり、デフォルトでは、水平方向にコンパクトな環境(iPhoneなど)では、.Popover
モーダルプレゼンテーションスタイルは.FullScreen
として扱われます。 iPadでポップオーバーとして表示されるものは、iPhoneではフルスクリーン表示ビューとして表示され、インターフェースを完全に置き換えます。
IPhoneでこの動作を回避するには、デリゲートメソッド adaptivePresentationStyleForPresentationController
をUIViewController
内に実装して、ポップオーバーを正しく表示する必要があります。
私の意見ではもう1つの方法はより簡単で、Interface Builderを使用して、UIButton
からViewController
へのセグエを作成し、セグエでPopover
セグエを選択するだけです。
これがお役に立てば幸いです。
Swift 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
}
}
ポップアップとして表示したい1つのviewControllerにpopVC識別子を提供する必要があることに注意してください。
お役に立てば幸いです。
ここでは、ボタンのクリック時にポップオーバーを表示できます。
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)
}
Swift 4バージョン
ストーリーボードからほとんどの作業を行う
私はViewController
を追加し、その属性インスペクターに行き、「Use Preferred Explicit size」を選択しました。その後、幅と高さの値をそれぞれ50に変更しました。
これが完了したら、Ctrlキーを押しながらボタンからViewController
にドラッグし、[Present as Popover]を選択して、セグエ識別子に「pop」という名前を付けました。
ButtonのあるViewController
に行き、次のコードを追加しました。
class FirstViewController: UIViewController, UIPopoverPresentationControllerDelegate {
@IBOutlet weak var popoverButton: UIButton! // the button
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "pop" {
let popoverViewController = segue.destination
popoverViewController.modalPresentationStyle = .popover
popoverViewController.presentationController?.delegate = self
popoverViewController.popoverPresentationController?.sourceView = popoverButton
popoverViewController.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: popoverButton.frame.size.width, height: popoverButton.frame.size.height)
}
}
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
override func viewDidLoad() {
super.viewDidLoad()
}
}