我正在尝试在导航控制器内部使用Hero的两个控制器之间实现转换。 我有这种方法来处理平移手势:
@objc func pannedCell(gesture: UIPanGestureRecognizer) {
guard let animatedView = gesture.view as? HotelListingCollectionViewCell else {
return
}
let translation = gesture.translation(in: nil)
let screenHeight = self.rootView.bounds.height
let progress = ((-1 * translation.y) / screenHeight) * 2
print(progress)
switch gesture.state {
case .began:
self.initialViewPostion = animatedView.center
Hero.shared.defaultAnimation = .fade
let vc = ListingSearchViewController()
vc.viewModel.hotels.value = self.viewModel.hotels.value
self.navigationController?.pushViewController(vc, animated: true)
case .changed:
Hero.shared.update(progress)
let pos = CGPoint(
x: animatedView.center.x + translation.x,
y: self.rootView.hotelResultsCollectionView.center.y + translation.y
)
Hero.shared.apply(modifiers: [
.position(pos),
.useGlobalCoordinateSpace,
.useOptimizedSnapshot
], to: animatedView)
default:
if progress > 0.8 {
Hero.shared.finish()
} else {
Hero.shared.cancel()
}
}
}
这里的问题是pushViewController方法需要大约1秒才能执行,因此当我开始拖动视图时,它会在我的手指下移动。我开始在屏幕上移动手指后1秒钟。
我做错了吗?
由于
答案 0 :(得分:0)
好的,我想我找到了一些东西!
这个问题似乎与我在手势处理程序的情况下所做的操作有关。
我将新视图控制器的实例化移出此调用以避免在动画期间重载UI线程,并且一切似乎都按预期工作。