[ios] iOS 8에서 올바르게 팝 오버를 표시하는 방법

Swift iOS 8 앱에 UIPopoverView를 추가하려고하는데 팝 오버가 올바른 모양으로 표시되지 않기 때문에 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)

}

나는 똑같은 출력을 얻습니다.

팝 오버의 크기를 어떻게 사용자 정의합니까? 어떤 도움이라도 대단히 감사하겠습니다!



답변

좋아, 한 집 친구가 그것을보고 알아 냈다.

 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)

}

바로 그거야.

더 이상 팝 오버 자체와 대화하지 않고 속성을 호출하여 콘텐츠 크기를 설정하기 위해 그 안에있는 뷰 컨트롤러와 대화합니다. preferredContentSize


답변

사실 그것은 그것보다 훨씬 간단합니다. 스토리 보드에서 팝 오버로 사용할 viewcontroller를 만들고 평소와 같이 viewcontroller 클래스를 만들어야합니다. 팝 오버를 열려는 개체에서 아래와 같이 segue를 만듭니다.이 경우에는 UIBarButton“Config”라는 이름으로 지정합니다.

여기에 이미지 설명 입력

“mother viewcontroller”에서 UIPopoverPresentationControllerDelegate및 delegate 메소드를 구현합니다 .

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)
        }
    }
}

그리고 당신은 끝났습니다. 이제 팝 오버보기를 다른보기로 취급 할 수 있습니다. 필드를 추가하고 무엇을하지 마십시오! 그리고 다음을 사용하여 콘텐츠 컨트롤러를 확보 할 수 있습니다.popoverPresentationController.presentedViewController 메서드를 를 확보합니다 UIPopoverPresentationController.

또한 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


답변

스위프트 2.0

글쎄요. 보세요. 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]; }


답변

여기에서 “Joris416″Swift 코드를 Objective-c로 변환합니다.

-(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 Day-by-Day 블로그

간단히 말해 UIViewController의 modalPresentationStyle을 .Popover로 설정하면 컨트롤러의 popoverPresentationController 속성을 통해 UIPopoverPresentationClass (새로운 iOS8 클래스)를 확보 할 수 있습니다.