programing

iOS 8에서 팝업을 올바르게 표시하는 방법

muds 2023. 11. 2. 22:10
반응형

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

출력:

enter image description here

UIPopover Presentation Controller를 통해 동일한 작업을 수행할 때도 여전히 수행되지 않습니다.이게 내 코드입니다.

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

사실 이것은 그것보다 훨씬 간단합니다.스토리보드에서 사용할 뷰 컨트롤러를 팝업으로 만들고 뷰 컨트롤러 클래스를 평소처럼 만들어야 합니다.팝업을 열고 싶은 개체에서 아래와 같이 seegue를 만듭니다. 이 경우에는UIBarButton이름은 "Config"입니다.

enter image description here

"Mother View Controller"에서 다음을 구현합니다.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)
        }
    }
}

그리고 당신은 끝났어요.이제 팝업 뷰를 다른 뷰(즉, 필드 추가 등)로 취급할 수 있습니다!그리고 당신은 컨텐츠 컨트롤러를 사용하여 손에 넣을 수 있습니다.popoverPresentationController.presentedViewController메소드 인 더UIPopoverPresentationController.

아이폰에서도 덮어쓰기를 해야 합니다.

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {

        return UIModalPresentationStyle.none
    } 

장치/방향 https://github.com/frogcjn/AdaptivePopover_iOS8_Swift 에 관계없이 항상 팝업을 표시할 수 있도록 이 모든 것을 작동시키는 방법에 대한 완벽한 예를 찾았습니다.

핵심은 UIA Adaptive Presentation Controller 딜러를 구현하는 것입니다.

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

저는 운동을 했습니다.한번 보세요.스토리보드에서 보기 컨트롤러를 만들었습니다.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.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(기본:UIView) 메서드는 ViewDidLoad 앞에 배치해야 합니다.도움이 되길 바랍니다!

iOS9 UIPoverController에서는 사용하지 않습니다.그래서 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 Code를 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;
}

ADD할 것을 기억합니다.
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate

이는 iOS8 Day-by-Day 블로그에서 가장 잘 설명됩니다.

간단히 말해, UIViewController의 modal Presentation Style을 로 설정한 후에 말입니다.팝업, 컨트롤러의 popover Presentation Controller 속성을 통해 UIP popover Presentation Class(새로운 iOS8 클래스)를 가져올 수 있습니다.

위의 Objective-C 버전의 Imagine Digitals 빠른 답변을 만들었습니다.사전 테스트 중에 작동하는 것 같아서 빠진 것은 없는 것 같은데 발견되면 알려주시면 업데이트하겠습니다.

-(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];
}

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
}

및 실험:

funcaptive PresentationStyle...

    return .popover

또는: .pageSheet... 등을 반환합니다.

View 컨트롤러에 UIA Adaptive PresentationControllerDelegate를 구현합니다.그런 다음 추가:

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

다음은 팝업을 구성하고 표시하는 방법에 대한 꽤 포괄적인 가이드입니다.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)
}

도움이 되길 바랍니다.

 var popoverContent = (self.storyboard?.instantiateViewController(withIdentifier: "WhatsNewViewController"))! as UIViewController
        var nav = UINavigationController(rootViewController: popoverContent)
    nav.modalPresentationStyle = UIModalPresentationStyle.popover
        var popover = nav.popoverPresentationController
        popoverContent.preferredContentSize = CGSize(width: 500, height: 100)
        popover?.delegate = self
        popover?.sourceView = self.view
        popover?.sourceRect = CGRectMake(100,100,0,0)

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

공부하고 싶은 사람들을 위해!

저는 Popover view를 연구하고 사용하려는 사람들을 위해 Open Source 프로젝트를 만들었습니다.프로젝트는 여기서 찾을 수 있습니다.https://github.com/tryWabbit/KTListPopup

KTListNewResize

언급URL : https://stackoverflow.com/questions/24635744/how-to-present-popover-properly-in-ios-8

반응형