Swift iOS 8アプリにUIPopoverViewを追加しようとしていますが、Popoverが正しい形状で表示されないため、PopoverContentSizeプロパティにアクセスできません。私のコード:
var popover: UIPopoverController? = nil
func addCategory() {
var newCategory = storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: newCategory)
popover = UIPopoverController(contentViewController: nav)
popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
popover!.delegate = self
popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
出力:
私がUIPopoverPresentationControllerを介して同じことをしているとき、私はまだそれを成し遂げません。これは私のコードです:
func addCategory() {
var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController as UIPopoverPresentationController
popover.delegate = self
popover.popoverContentSize = CGSizeMake(1000, 300)
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
まったく同じ出力が得られます。
Popoverのサイズをカスタマイズするにはどうすればよいですか。任意の助けは大歓迎です!
さて、ある同居人はそれを見て、それを考え出しました:
func addCategory() {
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(500,600)
popover.delegate = self
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
それがやり方です。
Popover自体とはもう対話しません。preferredContentSize
プロパティを呼び出して、コンテンツサイズを設定するためにその中のView Controllerと対話します。
実際にはそれよりずっと簡単です。ストーリーボードでは、ポップオーバーとして使用するビューコントローラを作成し、通常どおりにビューコントローラクラスを作成します。ポップオーバーを開きたいオブジェクト、この場合は "Config"という名前のUIBarButton
から、以下に示すようにセグエを作成します。
"mother viewcontroller"でUIPopoverPresentationControllerDelegate
とデリゲートメソッドを実装します。
func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
//do som stuff from the popover
}
このようにprepareForSeque
メソッドをオーバーライドします。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//segue for the popover configuration window
if segue.identifier == "yourSegueIdentifierForPopOver" {
if let controller = segue.destinationViewController as? UIViewController {
controller.popoverPresentationController!.delegate = self
controller.preferredContentSize = CGSize(width: 320, height: 186)
}
}
}
そして、これで終わりです。そして、ポップオーバービューを他のビューと同じように扱うことができます。フィールドを追加するそして、あなたはUIPopoverPresentationController
のpopoverPresentationController.presentedViewController
メソッドを使うことでコンテンツコントローラを手に入れることができます。
IPhoneの場合も上書きする必要があります
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
私はあなたが常に常にポップオーバーを表示することができるように、これらすべてをうまく動作させる方法の完全な例を見つけました https) ://github.com/frogcjn/AdaptivePopover_iOS8_Swift .
キーはUIAdaptivePresentationControllerDelegateを実装することです
func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -> UIModalPresentationStyle {
// This *forces* a popover to be displayed on the iPhone
return .None
}
次に上記の例を拡張します(Imagine Digitalから)。
nav.popoverPresentationController!.delegate = implOfUIAPCDelegate
Swift 2.
まあ私はうまくいきました。見てください。 StoryBoardでViewControllerを作りました。 PopOverViewControllerクラスに関連付けられています。
import UIKit
class PopOverViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.preferredContentSize = CGSizeMake(200, 200)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "dismiss:")
}
func dismiss(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
ViewControllerを参照してください。
// ViewController.Swift
import UIKit
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
func showPopover(base: UIView)
{
if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("popover") as? PopOverViewController {
let navController = UINavigationController(rootViewController: viewController)
navController.modalPresentationStyle = .Popover
if let pctrl = navController.popoverPresentationController {
pctrl.delegate = self
pctrl.sourceView = base
pctrl.sourceRect = base.bounds
self.presentViewController(navController, animated: true, completion: nil)
}
}
}
override func viewDidLoad(){
super.viewDidLoad()
}
@IBAction func onShow(sender: UIButton)
{
self.showPopover(sender)
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
}
注:func showPopover(base:UIView)メソッドはViewDidLoadの前に配置する必要があります。それが役に立てば幸い !
IOS9では、UIPopoverControllerは非推奨です。そのため、iOS9.x以上のObjective-Cバージョンには以下のコードを使用できます。
- (IBAction)onclickPopover:(id)sender {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *viewController = [sb instantiateViewControllerWithIdentifier:@"popover"];
viewController.modalPresentationStyle = UIModalPresentationPopover;
viewController.popoverPresentationController.sourceView = self.popOverBtn;
viewController.popoverPresentationController.sourceRect = self.popOverBtn.bounds;
viewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:viewController animated:YES completion:nil]; }
ここで私はObjective-cに "Joris416" Swift Codeを変換します、
-(void) popoverstart
{
ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"PopoverView"];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
nav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popover = nav.popoverPresentationController;
controller.preferredContentSize = CGSizeMake(300, 200);
popover.delegate = self;
popover.sourceView = self.view;
popover.sourceRect = CGRectMake(100, 100, 0, 0);
popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:nav animated:YES completion:nil];
}
-(UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller
{
return UIModalPresentationNone;
}
追加することを忘れないでくださいUIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
これは iOS8日々のブログ で最もよく説明されています
つまり、UIViewControllerのmodalPresentationStyleを.Popoverに設定すると、コントローラのpopoverPresentationControllerプロパティを介してUIPopoverPresentationClass(新しいiOS 8クラス)を取得できます。
xcode 9.1/Swift 4のための私の2セント。
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
override func viewDidLoad(){
super.viewDidLoad()
let when = DispatchTime.now() + 0.5
DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in
// to test after 05.secs... :)
self.showPopover(base: self.view)
})
}
func showPopover(base: UIView) {
if let viewController = self.storyboard?.instantiateViewController(withIdentifier: "popover") as? PopOverViewController {
let navController = UINavigationController(rootViewController: viewController)
navController.modalPresentationStyle = .popover
if let pctrl = navController.popoverPresentationController {
pctrl.delegate = self
pctrl.sourceView = base
pctrl.sourceRect = base.bounds
self.present(navController, animated: true, completion: nil)
}
}
}
@IBAction func onShow(sender: UIButton){
self.showPopover(base: sender)
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle{
return .none
}
と実験:
func adaptivePresentationStyle ...
return .popover
または:.pageSheet ....などを返します。
上記のImagine Digitals SwiftのObjective-Cバージョンを作成しました。予備テストの下ではうまくいくと思われるので、私は何も見逃していないと思います。
-(void) presentPopover
{
YourViewController* popoverContent = [[YourViewController alloc] init]; //this will be a subclass of UIViewController
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:popoverContent];
nav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popover = nav.popoverPresentationController;
popoverContent.preferredContentSize = CGSizeMake(500,600);
popover.delegate = self;
popover.sourceRect = CGRectMake(100,100,0,0); //I actually used popover.barButtonItem = self.myBarButton;
[self presentViewController:nav animated:YES completion:nil];
}
ViewControllerにUIAdaptivePresentationControllerDelegateを実装します。それから加えて :
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle{
return .none
}
あらゆる目的でPopoverビューを勉強して使用したい人のために、オープンソースプロジェクトを作成しました。ここでプロジェクトを見つけることができます。 https://github.com/tryWabbit/KTListPopup
以下はポップオーバーを設定して表示する方法に関するかなり包括的なガイドです。 https://www.appcoda.com/presentation-controllers-tutorial/
まとめると、実行可能な実装(Swift 4.2の元の記事の構文からいくつかの更新を加えたもの)は、次のようになります。以下:
func showPopover(ofViewController popoverViewController: UIViewController, originView: UIView) {
popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
if let popoverController = popoverViewController.popoverPresentationController {
popoverController.delegate = self
popoverController.sourceView = originView
popoverController.sourceRect = originView.bounds
popoverController.permittedArrowDirections = UIPopoverArrowDirection.any
}
self.present(popoverViewController, animated: true)
}
このことの多くは@mmcからの回答で既に取り上げられていますが、この記事では使用されているコード要素のいくつかを説明し、それをどのように拡張できるかについても説明します。
また、iPhoneとiPadのプレゼンテーションスタイルを処理したり、フルスクリーンで表示されている場合にポップオーバーを閉じることができるようにするための、委任の使用に関する追加の詳細も多数記載されています。繰り返しますが、Swift 4.2に更新されました。
func adaptivePresentationStyle(for: UIPresentationController) -> UIModalPresentationStyle {
//return UIModalPresentationStyle.fullScreen
return UIModalPresentationStyle.none
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
if traitCollection.horizontalSizeClass == .compact {
return UIModalPresentationStyle.none
//return UIModalPresentationStyle.fullScreen
}
//return UIModalPresentationStyle.fullScreen
return UIModalPresentationStyle.none
}
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
switch style {
case .fullScreen:
let navigationController = UINavigationController(rootViewController: controller.presentedViewController)
let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(doneWithPopover))
navigationController.topViewController?.navigationItem.rightBarButtonItem = doneButton
return navigationController
default:
return controller.presentedViewController
}
}
// As of Swift 4, functions used in selectors must be declared as @objc
@objc private func doneWithPopover() {
self.dismiss(animated: true, completion: nil)
}
お役に立てれば。