Пояснение кода:
- — представление SwiftUI с кнопкой и меткой счетчика.
Код: Выделить всё
ContentView1
- – VStack с текстом внизу и пробелами
Код: Выделить всё
ContentView2
сверху - — стандартный контроллер представления UIKit, который
Код: Выделить всё
ViewController
встраивает каждое из этих представлений в свой собственный хост-контроллер и
накладывает ContentView2 на ContentView1.
ContentView1
Код: Выделить всё
struct ContentView1: View {
@State var count = 0
var body: some View {
VStack {
Text("\(count)")
Button(
action: {
count += 1
},
label: {
Text("Increase")
}
)
}
}
}
Код: Выделить всё
struct ContentView2: View {
var body: some View {
VStack {
Spacer()
Text("Hello world")
}
}
}
Код: Выделить всё
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Add ContentView1
let view1 = ContentView1()
let hosting1 = UIHostingController(rootView: view1)
hosting1.view.translatesAutoresizingMaskIntoConstraints = false
self.addChild(hosting1)
self.view.addSubview(hosting1.view)
NSLayoutConstraint.activate([
hosting1.view.topAnchor.constraint(equalTo: self.view.topAnchor),
hosting1.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
hosting1.view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
hosting1.view.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
])
// Add ContentView2
let view2 = ContentView2()
let hosting2 = UIHostingController(rootView: view2)
hosting2.view.translatesAutoresizingMaskIntoConstraints = false
hosting2.view.backgroundColor = .clear
self.addChild(hosting2)
self.view.addSubview(hosting2.view)
NSLayoutConstraint.activate([
hosting2.view.topAnchor.constraint(equalTo: self.view.topAnchor),
hosting2.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
hosting2.view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
hosting2.view.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
])
}
}
Кнопка в ContentView1 не работает, и я не могу найти способ отключить событие касания перешло из ContentView2 -> ContentView1.
Что я рассмотрел:
- Вы замечу, что я уже добавил hosting2.view.backgroundColor = .clear — ContentView1 виден, но его нельзя коснуться.
- Невозможно сделать hosting2.view.isUserInteractionEnabled = false, потому что я нужно какое-то взаимодействие с ним (не включено в упрощенный фрагмент).
- Я не могу переписать это как одно представление SwiftUI внутри ZStack — помните, что это упрощенная версия некоторого производственного кода. что я не могу легко перенастроить таким образом.
- Реализуйте пользовательский PassthroughView, который наследуется от UIView и реализует точку переопределения функции (внутренняя точка: CGPoint, с событием: UIEvent?) -> Bool
- Создать PassthroughHostingController и переопределить loadView, установив пользовательское сквозное представление
Как это решить?
Подробнее здесь: https://stackoverflow.com/questions/793 ... controller