gpt4 book ai didi

ios - 在当前上下文中呈现 View Controller 是模态的并且无法正确旋转

转载 作者:行者123 更新时间:2023-11-30 11:18:01 25 4
gpt4 key购买 nike

适用于 iOS 11.4、Swift 4 和 Xcode 9。

我试图在当前上下文上呈现一个 View Controller ,以便底层上下文变暗但仍然可见。我使用以下代码执行此操作:

let storyboard = UIStoryboard(name: "Main", bundle: nil)l
let vc = storyboard.instantiateViewController(withIdentifier: "LoginView") as! LoginViewController
vc.modalPresentationStyle = .overCurrentContext
vc.modalTransitionStyle = .coverVertical

present(vc, animated: true, completion: nil)

let ppc = vc.popoverPresentationController

ppc?.sourceView = tableView
ppc?.sourceRect = tableView.bounds
ppc?.delegate = vc

LoginViewController 有一个位于其主视图中心的 View (popview),其中包含我的可编辑控件。最初工作正常,但我遇到了一些问题:

  1. 所呈现的 View Controller 的行为是模态的。 IE。我无法通过单击弹出 View 外部来关闭它。正如我所假设的,这是因为呈现的 View Controller View 永远不会接收触摸事件,因为它们被呈现的 View 捕获。
  2. 设备旋转至横向后,只有部分屏幕会被 LoginViewController 的暗淡 View 填充。

我尝试通过使用 LoginViewController 的主视图的 channel View 来解决问题 1

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
{
let view = super.hitTest(point, with: event)
return view == self ? nil : view
}

这没有帮助。我可以在主视图上使用 UITapGestureRecognizer ,如果触摸不在 popview 中,则从那里调用解雇,但这对我来说似乎相当笨拙,我想知道是否有更好的方法。

我不知道如何解决问题 2。我尝试了 UIPopoverPresentationController 的委托(delegate)函数,但这也不起作用,因为当我使用 .overCurrentContext 时,vc.popoverPresentationController 始终为零。

当我将 modalPresentationStyle 设置为 .popover 时,我得到了 popoverPresentationController 的值,但我的 LoginView 将完全覆盖呈现的 Controller View 。

最佳答案

经过一番深入研究,我最终找到了问题 2 的解决方案:以 Android 方式实现:

呈现 View Controller 中,我添加了以下功能:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
{
if (loginViewController != nil)
{
present(loginViewController!, animated:false, completion: nil)
}
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
{
super.viewWillTransition(to: size, with: coordinator)

loginViewController!.dismiss(animated: false, completion: nil)

}

因此,当方向发生变化时,弹出窗口 View 首先会被关闭,并且在执行更改后,弹出窗口会再次呈现。由于所呈现的 View Controller 在此过程中未受到损害,因此即使已经在所呈现的 View Controller 的控件中输入的数据仍然保留。

为了解决问题 1,我在呈现的 View Controller 中添加了:

override func viewDidLoad()
{
super.viewDidLoad()

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
view.addGestureRecognizer(tapGesture)
}

@objc func handleTap(sender: UITapGestureRecognizer)
{
let touchpoint = sender.location(in: view)
let popviewrect = popview.frame

if (!popviewrect.contains(touchpoint))
{
dismiss(animated: true, completion: nil)
delegate?.onDismissed()
}
}

呈现 Controller 实现onDismissed委托(delegate):

func onDismissed()
{
loginViewController = nil
}

仍然想知道是否有更优雅的方法来做到这一点

关于ios - 在当前上下文中呈现 View Controller 是模态的并且无法正确旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51579412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com