斯威夫特 | UIViewController 不显示为 PopUp 但全屏

Posted

技术标签:

【中文标题】斯威夫特 | UIViewController 不显示为 PopUp 但全屏【英文标题】:Swift | UIViewController not showing as PopUp but Fullscreen 【发布时间】:2019-05-17 06:38:24 【问题描述】:

所以我有一个视图控制器,它基本上是一个警报窗口,它应该是一个弹出窗口,并通过在其框架外的点击将其关闭。

但每当我调用那个 VC 时,它总是显示为全屏而不是弹出窗口。

我已经尝试了几种方法来做到这一点,如下所述。

 if let exp : String = expiredVehicles[i] 
        expiredVehicleNumber = expiredVehicles[i]
            let popUpVC = SubscriptionExpired()
            popUpVC.modalTransitionStyle = .crossDissolve
            popUpVC.modalPresentationStyle = .popover // also tried other presentation styles but none work and it is still fullscreen
            popUpVC.view.backgroundColor = UIColor.white.withAlphaComponent(0.8)
            self.present(popUpVC, animated: true, completion: nil)
        

如果有人需要查看该 VC 的定义,我很乐意分享它

我觉得我应该提到要显示为弹出窗口的 VC 是继承 UIViewController

任何可能有帮助的见解都会很棒。

感谢您的意见

【问题讨论】:

能否显示截图或将popover改为overCurrentContext 可以查看***.com/questions/26598099/… @AtalayAsa 我通过了它并将演示样式设置为自定义并且仍然全屏,我应该放框架还是什么?因为我被打败了 所以你用的是 iPad 对吧? @wings overCurrentContext 是我尝试的第一个,但也没有运气,还有其他想法吗?也许我应该给框架? 【参考方案1】:

一种可能的方法是向您的视图添加一个轻击手势识别器,这会关闭 VC。

但这只有在此弹出窗口包含只读信息并且不需要用户采取任何进一步操作时才有用。

func addTapRecognizer()
    let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
    self.view.addGestureRecognizer(tap)


@objc func handleTap()
       // dismiss the VC here
    

【讨论】:

是的,我知道这个解决方案,但这更像是一种解决方法,不确定我的雇主是否会允许它。另一个问题是 VC 也有一个按钮,它将重定向到客户帮助热线页面,所以如果我将点击手势添加到整个视图,该按钮将停止工作【参考方案2】:

您可以调用以下方法显示弹出窗口:

    let popupVC = SubscriptionExpired()
    popupVC.modalPresentationStyle = .overCurrentContext
    self.addChild(popupVC)
    popupVC.view.frame = self.view.frame
    self.view.addSubview(popupVC.view)
    popupVC.didMove(toParent: self)

然后,要删除该弹出窗口,您可以使用:

UIView.animate(withDuration: 0.25, animations: 
    self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
    self.view.alpha = 0.0
, completion:  (finished) in
    if finished 
        self.view.removeFromSuperview()
    
)

在这种情况下,我在弹出窗口中有一个按钮,只要按下该按钮,就会触发上述方法。你能试试吗?我可以根据您的需要编辑我的答案。

【讨论】:

兄弟,这个应用程序中的所有内容都是完全以编程方式完成的,任何地方都没有使用故事板或界面构建器,所以我认为这不会有任何帮助....或者会吗? 即使您的应用程序以编程方式完成也没关系,您可以使用let popupVC = PopupVC() 之类的方法并显示该视图控制器。 好的,我会试一试,但是我应该在哪里声明要呈现的 VC 的类型。请记住,我仍然是 swift 的业余爱好者 兄弟都不走运,现在 VC 是全屏的,但 UITabbar 是可见的,但仍然没有消失,当我添加代码的第二部分以关闭时,它只是将整个视图变成黑屏但是uitabbar 仍然可见【参考方案3】:

您需要在展示视图控制器中实现这一点:

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle 
    // Return no adaptive presentation style, use default presentation behaviour
    return .none

UIPopoverPresentationController displaying popover as full screen

【讨论】:

以上是关于斯威夫特 | UIViewController 不显示为 PopUp 但全屏的主要内容,如果未能解决你的问题,请参考以下文章

uiViewController 中的 uiTableView:缺少某些东西

我不能在开关内沮丧吗? (斯威夫特 3)

如何获取 UIAlertController 的文本字段值并将其用于其他功能? (斯威夫特 3)

Swift 中“使用未解析的标识符”

表格视图不显示数据,为啥? (斯威夫特 3)

斯威夫特委托不工作