以模态方式呈现视图控制器

5

我在使用视图控制器模态展示登录页面时遇到了问题。虽然我可以让控制器出现,但是我无法将其改变为全屏以外的大小。

我试图在屏幕中心显示弹出窗口并带有淡化的背景。当我在视图外单击时,弹出窗口应该消失。

我已经查看了整个网站上的问题和答案,但没有找到适合我的解决方案。

以下是我的代码:

import UIKit

class SignInView: UIViewController, UIPopoverPresentationControllerDelegate {


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "popoverSegue" {

    var popover = segue.destination as! SignInPopView
    popover.popoverPresentationController!.delegate = self
    popover.modalPresentationStyle = UIModalPresentationStyle.popover
    popover.preferredContentSize = CGSize(width: 375, height: 500)

    }

}

这是在手机上还是iPad上? - Paulw11
它可以用于两种情况。 - JSharpp
我问这个问题是因为在 iPhone 上,除非你告诉 iOS 否则,弹出窗口会以模态方式呈现。- https://dev59.com/nFkS5IYBdhLWcg3wXFnc - Paulw11
3个回答

3
要将您的视图控制器显示为弹出窗口,您应该进行以下设置:

popupVC.modalPresentationStyle = .OverCurrentContext

popupVC.modalTransitionStyle = .CrossDissolve

并且设计您的视图控制器的位置和大小,使其看起来像一个弹出窗口。 您还可以使用 EzPopup 这是一个不错的 pod 我使用了 EzPopup,它对我很有用。

0
我的解决方案是创建一个模态转场到新的视图控制器。将内容放置在视图控制器内的视图中,并将视图控制器的背景不透明度设置为所需数量。这一切都可以通过Storyboard完成。
这样,当弹出视图控制器出现时,视图会出现在我想要的位置,以正确的大小呈现,而且前一个视图控制器仍然可见于背景后面。
我遇到的唯一问题就是在视图之外单击时关闭模态弹出框。
这个视频非常有帮助:https://www.youtube.com/watch?v=S5i8n_bqblE 编辑:这个检测当前视图之外的任何点击提供了解决方案,可以在点击视图之外时关闭该模态。

但那不是一个弹出窗口。 - matt
我想这更像是一个模态框或弹出框,而不是带箭头的气泡框。无论哪种方式,它正是我所寻找的。我已更新答案,说明如何在触摸视图外部时关闭模态框。 - JSharpp
但如果这就是你想要的,那么称它为弹出框是不公平和误导的。 - matt
我同意,这是一个诚实的错误,因为它们非常相似。我会更改问题的标题以防止混淆。无论如何,这是一个完全功能的解决方案,适用于一般问题。 - JSharpp

0

这个答案对我有用: https://dev59.com/Q14b5IYBdhLWcg3w7Fgv#46518387

class CommonViewController: UIViewController, UIPopoverPresentationControllerDelegate{

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

func showPopover(){
    let storyboard = UIStoryboard(name: "Pickers", bundle: nil)
    let myViewController = UIViewController()
    myViewController.preferredContentSize = CGSize(width: 320, height: 200)
    myViewController.modalPresentationStyle = .popover

    let popOver = myViewController.popoverPresentationController
    popOver?.delegate = self

    self.present(myViewController, animated: true, completion: nil)
    popOver?.permittedArrowDirections = .init(rawValue: 0)
    popOver?.sourceView = self.view

    let rect = CGRect(
        origin: CGPoint(x: self.view.frame.width/2, y: self.view.frame.height/2),
        size: CGSize(width: 1, height: 1)
    )
    popOver?.sourceRect = rect
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接