programing

iOS 8 iPhone에서 UIPopover 프레젠테이션 컨트롤러

newstyles 2023. 9. 6. 21:52

iOS 8 iPhone에서 UIPopover 프레젠테이션 컨트롤러

혹시 아는 사람?UIPopoverPresentationController아이폰에서 팝업을 보여주는 데 사용할 수 있습니까?Apple이 iPad와 iPhone을 위한 보다 통합된 프레젠테이션 컨트롤러를 만들기 위해 iOS 8에 이 기능을 추가했는지 궁금합니다.

베타에서 질문/답변을 해도 되는지 확실하지 않습니다.그런 경우에는 제거하겠습니다.

기본 적응 동작을 재정의할 수 있습니다(UIModalPresentationFullScreen콤팩트한 수평 환경, 즉 아이폰)을 사용하여adaptivePresentationStyleForPresentationController:방법을 통해 사용 가능UIPopoverPresentationController.delegate.

UIPresentationController이 방법을 사용하여 새로운 프레젠테이션 스타일을 사용하도록 요청합니다. 당신의 경우에는 단순히 반환합니다.UIModalPresentationNone원인이 될 것입니다.UIPopoverPresentationController전체 화면 대신 팝업으로 렌더링합니다.

다음은 스토리보드의 seegue 설정을 사용한 팝업의 예입니다.UIBarButtonItem"모달리" 발표하다UIViewController

class SomeViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    // override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { // swift < 3.0
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "PopoverSegue" {
            if let controller = segue.destinationViewController as? UIViewController {
                controller.popoverPresentationController.delegate = self
                controller.preferredContentSize = CGSize(width: 320, height: 186)                
            }
        }
    }

    // MARK: UIPopoverPresentationControllerDelegate

    //func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { // swift < 3.0
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        // Return no adaptive presentation style, use default presentation behaviour
        return .None
    }
}

이 트릭은 WWDC 2014 세션 214 "View Controller Advancement in iOS8"(36:30)에서 언급되었습니다.

만약 누군가 코드만 있는 팝업을 보여주고 싶다면, 당신은 다음의 방법을 사용할 수 있습니다.

목표 - C

의 속성을 선언합니다.UIPopoverPresentationController:

@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;

UI 버튼에서 팝업을 표시하려면 다음 방법을 사용합니다.

- (IBAction)btnSelectDatePressed:(id)sender
{
    UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/
    dateVC.preferredContentSize = CGSizeMake(280,200);
    destNav.modalPresentationStyle = UIModalPresentationPopover;
    _dateTimePopover8 = destNav.popoverPresentationController;
    _dateTimePopover8.delegate = self;
    _dateTimePopover8.sourceView = self.view;
    _dateTimePopover8.sourceRect = sender.frame;
    destNav.navigationBarHidden = YES;
    [self presentViewController:destNav animated:YES completion:nil];
}

다음 방법을 사용하여 UIBarButtonItem에서 팝업을 표시합니다.

- (IBAction)btnSelectDatePressed:(id)sender
{
    UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/
    dateVC.preferredContentSize = CGSizeMake(280,200);
    destNav.modalPresentationStyle = UIModalPresentationPopover;
    _dateTimePopover8 = destNav.popoverPresentationController;
    _dateTimePopover8.delegate = self;
    _dateTimePopover8.sourceView = self.view;
     CGRect frame = [[sender valueForKey:@"view"] frame];
    frame.origin.y = frame.origin.y+20;
    _dateTimePopover8.sourceRect = frame;
    destNav.navigationBarHidden = YES;
    [self presentViewController:destNav animated:YES completion:nil];
}

뷰 컨트롤러에서도 이 위임자 메소드를 구현합니다.

- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}

이 팝업을 취소하려면 보기 컨트롤러를 취소하기만 하면 됩니다.다음은 뷰 컨트롤러를 해제하는 코드입니다.

-(void)hideIOS8PopOver
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

스위프트

UIButton에서 팝업을 표시하려면 다음 방법을 사용합니다.

func filterBooks(sender: UIButon)
    {
        let filterVC =  FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil)
        var filterDistanceViewController = UINavigationController(rootViewController: filterVC)
        filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205)
        let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController
        popoverPresentationViewController?.permittedArrowDirections = .Any
        popoverPresentationViewController?.delegate = self
        popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
        popoverPresentationViewController!.sourceView = self.view;
        popoverPresentationViewController!.sourceRect = sender.frame

        filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
        filterDistanceViewController.navigationBarHidden = true
        self.presentViewController(filterDistanceViewController, animated: true, completion: nil)
    }

다음 방법을 사용하여 UIBarButtonItem에서 팝업을 표시합니다.

func filterBooks(sender: UIBarButtonItem)
    {
        let filterVC =  FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil)
        var filterDistanceViewController = UINavigationController(rootViewController: filterVC)
        filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205)
        let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController
        popoverPresentationViewController?.permittedArrowDirections = .Any
        popoverPresentationViewController?.delegate = self
        popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
        popoverPresentationViewController!.sourceView = self.view;
        var frame:CGRect = sender.valueForKey("view")!.frame
        frame.origin.y = frame.origin.y+20
        popoverPresentationViewController!.sourceRect = frame

        filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
        filterDistanceViewController.navigationBarHidden = true
        self.presentViewController(filterDistanceViewController, animated: true, completion: nil)
    }

뷰 컨트롤러에서도 이 위임자 메소드를 구현합니다.

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{
        return .None
    }

대리인을 추가해주십시오.UIPopoverPresentationControllerDelegate.h/.m/.m/.px 파일로

문제: iPhone 팝업은 전체 화면을 표시하며 선호하는 ContentSize 값을 존중하지 않습니다.

해결책: 애플이 UIPopover Presentation Controller Class 레퍼런스에서 제안한 것과는 달리, 팝업 프레젠테이션 컨트롤러를 레퍼런스 받아 구성한 후 뷰 컨트롤러프레젠테이션합니다.

// Get the popover presentation controller and configure it.
//...

// Present the view controller using the popover style.
[self presentViewController:myPopoverViewController animated: YES completion: nil]; 

UIA Adaptive Presentation Controller 딜러를 구현해야 합니다.

다음과 같이:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}

전체 화면 팝업을 원하지 않는 경우

해결책을 좀 찾았습니다.

Xcode 6.1에서 사용presentationController.delegate대신에popoverPresentationController.delegate.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier compare:@"showPopOver"] == NSOrderedSame) {
        UINavigationController * nvc = segue.destinationViewController;
        UIPresentationController * pc = nvc.presentationController;
        pc.delegate = self;
    }
}

#pragma mark == UIPopoverPresentationControllerDelegate ==
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}

WWDC 2014 "View Controller Advancements in iOS8"에서 아래 코드는 아이폰에서 팝업을 표시할 수 있습니다.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    UINavigationController * nvc = segue.destinationViewController;
    UIPopoverPresentationController * pvc = nvc.popoverPresentationController;
    pvc.delegate = self;
}

#pragma mark == UIPopoverPresentationControllerDelegate ==
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}

하지만 Xcode 6.1에서 이 코드들은 FullScreen presentation...(nvc.popover PresentationController가 nil입니다)

애플사의 버그가 아닌지 의심이 됩니다.

8에서는 iOS 8.3의 합니다.UIPopoverPresentationControllerDelegate을콜는콜r는elo'을UIModalPresentationStyle.

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

UIPopover PresentationControllerDelegate를 다음과 같이 확장할 수 있습니다.

protocol PopoverPresentationSourceView {}
extension UIBarButtonItem : PopoverPresentationSourceView {}
extension UIView : PopoverPresentationSourceView {}

extension UIPopoverPresentationControllerDelegate where Self : UIViewController {
   func present(popover: UIViewController, 
        from sourceView: PopoverPresentationSourceView, 
        size: CGSize, arrowDirection: UIPopoverArrowDirection) {

      popover.modalPresentationStyle = .popover
      popover.preferredContentSize = size
      let popoverController = popover.popoverPresentationController
      popoverController?.delegate = self
      if let aView = sourceView as? UIView {
          popoverController?.sourceView = aView
          popoverController?.sourceRect = CGRect(x: aView.bounds.midX, y: aView.bounds.midY, width: 0, height: 0)
      } else if let barButtonItem = sourceView as? UIBarButtonItem {
          popoverController?.barButtonItem = barButtonItem
      }
      popoverController?.permittedArrowDirections = arrowDirection
      present(popover, animated: true, completion: nil)
   }
}

이제 전화하셔도 됩니다.present(popover: from: size: arrowDirection: )구현하는 모든 보기 컨트롤러UIPopoverPresentationControllerDelegate예를 들면

class YourViewController : UIViewController {
    @IBAction func someButtonPressed(_ sender: UIButton) {
        let popover = SomeViewController()
        present(popover: popover, from: sender, size: CGSize(width: 280, height: 400), arrowDirection: .right)
    }
}

extension YourViewController : UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }
}

WEBVIEW 클래스에 이 두 가지 메서드를 추가합니다.덧붙이기

-(void) prepareForSegue: (UIStoryboardSegue * ) segue sender: (id) sender {
    // Assuming you've hooked this all up in a Storyboard with a popover presentation style
    if ([segue.identifier isEqualToString: @"showPopover"]) {
        UINavigationController * destNav = segue.destinationViewController;
        pop = destNav.viewControllers.firstObject;
        // This is the important part
        UIPopoverPresentationController * popPC = destNav.popoverPresentationController;
        popPC.delegate = self;
    }
}

- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}

UIA Adaptive PresentationControllerDelegate에서 다음 방법을 사용해야 합니다.

func adaptivePresentationStyle(for: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle

이 대신에:

func adaptivePresentationStyle(for: UIPresentationController) -> UIModalPresentationStyle

언급URL : https://stackoverflow.com/questions/25319179/uipopoverpresentationcontroller-on-ios-8-iphone