ios - SwiftUI 按钮在 UIHostingController 中不起作用

标签 ios swiftui uikit

我有一个 SwiftUI View ,我使用 UIHostingController 将其嵌入到现有的 UIViewController 中。 SwiftUI View 很简单,实际上我可以将其简化为这段代码并重现问题:

let hostingController = UIHostingController(rootView: Button {
   print("tapped")
} label {
   Text("Tap")
}

hostingController 作为 subview 添加到我现有的 View Controller 中,如下所示:

override func viewDidLoad() {
   super.viewDidLoad()
   view.addSubview(hostingController.view)
   // Code to set up autolayout constraints omitted.
   addChild(hostingController)
   hostingController.didMove(toParent: self)
}

该按钮在 Canvas 预览中可点击,但在模拟器或真实设备中不可点击。没有手势识别器或其他 View 覆盖 UIHostingController 的 View 。我尝试使用 .onTapGesture(perform:) 而不是 Button 但这也不起作用。为了让事情变得更奇怪,我可以添加一个 ScrollView 作为我的 SwiftUI 和滚 Action 品的 subview 。为什么我的按钮不起作用?

最佳答案

显然,问题在于父 UIViewController 正在使用图层转换将自身动画化到屏幕上。这种转变完全破坏了所有 SwiftUI 的点击手势。当我更改图层转换代码以仅更改 View 的框架时,一切正常。

有问题的转换代码如下所示:

view.transform = CGAffineTransform(translationX: -300, y: 0)

UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
    self.view.transform = CGAffineTransform.identity
}

我把它改成了这样:

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
}

关于ios - SwiftUI 按钮在 UIHostingController 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71339237/

相关文章:

ios - UIPopoverController presentPopoverFromBarButtonItem :. .. 偏心

ios - 用户是否可以将他们的整个应用程序目录发送给我以供分析?

ios - coredata NSFetchRequest 一对多关系 托管对象上的关系错误

arrays - 移动/重新排序数组中的特定项目 - SwiftUI

ios - 相机预览上的 SwiftUI 位置叠加

iphone - MPMoviePlayerController 和本地 m3u8 文件

ios - UIStackView 隐藏 View 动画

ios - NSUserDefaults无法更新nsmutablearray

ios - 仅当存在单个日历帐户时才会出现 EKCalendarChooser 问题

swift - IndexSet 引用部分的索引而不是行