#ios #swiftui #uikit #uihostingcontroller
#iOS #swiftui #uikit #uihostingcontroller
Вопрос:
Дано: UIHostingController размещен внутри UIKit superview.
Когда: преобразование Superview изменено до viewDidAppear. В этом примере перемещено на 200 пунктов вниз.
Затем: последующие изменения в преобразовании superview будут не синхронизированы. В этом примере я переместил его обратно в исходное местоположение. Хотя содержимое SwiftUI, по-видимому, находится в правильном месте, регистрация попадания по-прежнему находится в исходном местоположении, поэтому, чтобы нажать, мне нужно нажать ниже области, в которой оно отображается. (см. Скриншот)
Xcode 12.3 — Sim-карта iPhone 8 (iOS 14)
struct ContentView: View {
var body: some View {
Button(action: { print("Testing 123") }, label: {
Text("Button")
})
.padding()
.background(Color.gray)
}
}
class RootVC: UIViewController {
let hostingVC = UIHostingController(rootView: ContentView())
override func viewDidLoad() {
super.viewDidLoad()
hostingVC.view.translatesAutoresizingMaskIntoConstraints = false
view.translatesAutoresizingMaskIntoConstraints = false
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.didMove(toParent: self)
hostingVC.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
hostingVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
hostingVC.view.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
hostingVC.view.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
// Start translated down before view appears
view.transform = .init(translationX: 0, y: 200)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Move up on-appear (this would ususally happen in an animation block)
view.transform = .init(translationX: 0, y: 0)
}
}
Это огромная проблема для библиотеки компонентов, которую я создавал, которая должна взаимодействовать с контейнерами на основе UIKit (например, нижние листы).
Обновить:
Я обратился к Apple по этому поводу через их помощника по обратной связи, но ответа пока нет. Мой коллега нашел обходной путь, который, похоже, устраняет проблему, но мы понятия не имеем, почему это работает:
// Perform translation
containerView.transform = newTransform
swiftUISubview.layer.position.y = currentTransform.ty
containerView.setNeedsLayout()
containerView.layoutIfNeeded()
Комментарии:
1. Вы когда-нибудь находили решение для этого?
2. @RyanDaulton Я добавил обходной путь к исходному вопросу.