iOS弹出窗口中的视图控制器

时间:2017-05-14 23:40:55

标签: ios ipad uistoryboard uistoryboardsegue

所以我有我的主视图控制器。该视图控制器有一个条形按钮项目,其故事板为segue,种类设置为Present As Popover。

这一切都按预期工作。但是当您点击该弹出窗口控制器中的另一个按钮时,它会全屏显示视图。我希望它在popover中显示。就像在现有的popover界限之上推/显示一样。

我怎样才能做到这一点?

我只想在iPad上使用此行为。但我认为默认情况下会这样做。

修改

我更喜欢在故事板中完成所有操作,但如果这是必需的话,我也愿意使用Swift代码。

3 个答案:

答案 0 :(得分:6)

创建IBAction UIBarButtonItem,并付诸行动:

- (IBAction)popupAction:(UIBarButtonItem *)sender {
    UIViewController *vc = [[UIViewController alloc] init];  // I don't use segue
    vc.view.backgroundColor = [UIColor grayColor];
    vc.modalPresentationStyle = UIModalPresentationPopover;
    UIPopoverPresentationController *popvc = vc.popoverPresentationController;
    popvc.delegate = self;
    popvc.permittedArrowDirections = UIPopoverArrowDirectionAny;
    popvc.barButtonItem = sender; // if UIBarButtonItem
    // if view
    // popvc.sourceView = sender;
    // popvc.sourceRect = sender.bounds;

    vc.preferredContentSize = CGSizeMake(200, 200);

    [self presentViewController:vc animated:YES completion:nil];
}

UIPopoverPresentationControllerDelegate

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

- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
    return YES;
}

夫特:

@IBAction func popupAction(_ sender: UIBarButtonItem) {
    let vc = UIViewController.init()
    vc.view.backgroundColor = UIColor.gray
    vc.modalPresentationStyle = UIModalPresentationStyle.popover
    let popvc = vc.popoverPresentationController
    popvc?.delegate = self
    popvc?.permittedArrowDirections = UIPopoverArrowDirection.any
    popvc?.barButtonItem = sender
    vc.preferredContentSize = CGSize.init(width: 200, height: 200)

    self.present(vc, animated: true, completion: nil)
}

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

func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
    return true
}

适用于iPad和iPhone。

结果:

在弹出框控制器中弹出另一个viewController:

答案 1 :(得分:5)

这只适用于Storyboard。

1)从你的UIBarButtonItem创建一个UIViewController(蓝色)和ctrl + drag(鼠标)到UIViewController并选择“present as popover”(就像你一样)。

2)单击UIViewController(蓝色)并单击Editor-> embed in-> Navigation Controller(这将是让下一个控制器保持在弹出窗口中的技巧)

3)创建第二个UIViewController(绿色)

4)在第一个UIViewController中创建一个UIButton(蓝色)并按住Ctrl键并从按钮拖动到第二个UIViewController(绿色)并选择“show”

最后,它应该在Storyboard中显示如下:

enter image description here

结果:

enter image description here

enter image description here

如果你想要没有navigationBar的PopOver,你可以在蓝色控制器中使用:

self.navigationController?.isNavigationBarHidden = true

并从绿色到蓝色视图返回,您可以在绿色控制器中使用:

@IBAction func backToBlueController(sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
}

其他:

如果您不想使用popUp,您还可以将segue种类从barButtonItem更改为navigationController

  

目前模态

以及

之类的演示文稿
  

表单

在故事板中

enter image description here

乍一看,即使您不需要navigationBar,也应始终使用UINavigationController来管理导航,因为导航控制器会为您提供一个导航堆栈,您可以从中弹出并推入导航堆栈。

UINavigationController Reference

答案 2 :(得分:0)

你试过吗 - EzPopup(https://github.com/huynguyencong/EzPopup),一个Swift pod。只需几行代码:

// init YourViewController
let contentVC = ...

// Init popup view controller with content is your content view controller
let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200)

// show it by call present(_ , animated:) method from a current UIViewController
present(popupVC, animated: true)