Mat*_*ttL 11 uikit ios swiftui
我有一个 SwiftUI 视图,我使用 UIHostingController 将其嵌入到现有的 UIViewController 中。SwiftUI 视图很简单,事实上我可以将其简化为以下代码并重现该问题:
let hostingController = UIHostingController(rootView: Button {
print("tapped")
} label {
Text("Tap")
}
Run Code Online (Sandbox Code Playgroud)
HostingController 作为子视图添加到我现有的视图控制器中,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(hostingController.view)
// Code to set up autolayout constraints omitted.
addChild(hostingController)
hostingController.didMove(toParent: self)
}
Run Code Online (Sandbox Code Playgroud)
该按钮在画布预览中可点击,但在模拟器或真实设备上则不可点击。没有手势识别器或其他视图覆盖 UIHostingController 的视图。我尝试使用.onTapGesture(perform:)
按钮而不是按钮,但这也不起作用。为了让事情变得更奇怪,我可以添加一个 ScrollView 作为我的 SwiftUI 和滚动工作的子视图。为什么我的按钮不起作用?
显然,问题在于父 UIViewController 正在使用图层转换将自身动画到屏幕上。这种转变完全打破了所有 SwiftUI 的点击手势。当我更改图层转换代码以仅更改视图的框架时,一切正常。
有问题的转换代码如下所示:
view.transform = CGAffineTransform(translationX: -300, y: 0)
UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
self.view.transform = CGAffineTransform.identity
}
Run Code Online (Sandbox Code Playgroud)
我把它改成了这样:
view.frame.origin.x = view.frame.origin.x - 300
UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
self.view.frame.origin.x = self.view.frame.origin.x + 300
}
Run Code Online (Sandbox Code Playgroud)
有类似的问题,但未完成后解雇UIHostingConroller
。这是我的解决方案:
class SomePresentationController: UIPresentationController {
// ...
override func dismissalTransitionDidEnd(_ completed: Bool) {
super.dismissalTransitionDidEnd(completed)
// Magic, that fixes not working buttons and gestures after non finished dismiss
presentedViewController.view.bounds.origin.y = 0.1
presentedViewController.view.bounds.origin.y = .zero
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2352 次 |
最近记录: |