当用户使用自定义转换点击MKMapView
中的注释时,我正在呈现视图控制器。过渡动画显示的视图控制器的帧从注释的帧开始到其最终的全屏外观。
当关闭呈现的视图控制器时,用户有两个选项:她可以单击右上角的关闭按钮,并且关闭过渡将使视图返回到注释框架的动画。这部分工作正常。
但是用户也可以将视图向下拖动至少200点,当她抬起手指时,我希望同样的消除过渡运行,但是从“拖动”状态开始。
为了更详细一点,我提供的视图控制器的根视图有两个子视图:一个我称之为contentView
的子视图,它包含所有实际内容,并且是一个定义了UIPanGestureRecognizer
的视图。然后根据用户的手势向下移动;我称之为pullProgressView
的{{1}}位于contentView
之下,并在用户拖动时保持原位。它会显示一个圆圈,用于填充用户已经拖动的更深处,以指示释放手指将解除视图控制器。
手势识别器的基本部分如下所示:
let progress = sender.translation(in: contentView).y
let screen = UIScreen.main.bounds
if sender.state == .began || sender.state == .changed {
if progress > 0 {
// Dragged down -> allow movement of the view
contentView.center = CGPoint(x: contentView.center.x,
y: screen.size.height / 2 + progress)
}
} else if sender.state == .ended {
if contentView.frame.origin.y > threshold {
// Dragged down far enough to dismiss the view controller
print("contentView frame right before dismissing: \(contentView.frame)")
self.dismissView()
} else {
// Not dragged down far enough, animate the view back
// to its original position
UIView.animate(withDuration: 0.3) {
self.contentView.frame = screen
}
}
}
我调用animateTransition
时接管的dismissView()
方法包含以下代码:
let contentView = (transitionContext.viewController(forKey: .from) as! PresentedViewController).contentView!
print("contentView frame going into animateTransition: \(contentView.frame)")
问题在于,当我向下拖动视频控制器时抬起我的手指以解除视图控制器,视图“闪烁”回到其原始的未碎片状态。上面代码片段中的两个print
语句产生以下输出:
contentView frame right before dismissing: (0.0, 330.0, 375.0, 667.0)
contentView frame going into animateTransition: (0.0, 0.0, 375.0, 667.0)
因此contentView
的框架不会“存活”到animateTransition
方法中(请注意y
参数)。我可以在animateTransition
内通过询问UIPanGestureRecognizer
其进度来手动设置它,但是在contentView
移回其拖出的框架之前仍然存在难看的闪烁。
有谁知道如何解决这个问题?或者更好地解决这个问题?我读过UIPercentDrivenInteractiveTransition
,但它适用于我的情况吗?拖拽手势实际上并没有产生任何实际解雇动画的百分比(这会将帧变形回地图注释之一),所以我不知道如何使用UIPercentDrivenInteractiveTransition
来解决问题。
答案 0 :(得分:0)
我找到了一个使用视图控制器包含的不同解决方案。基本上我将子视图控制器及其视图作为子视图添加到呈现视图控制器。另外,我在子视图控制器的视图下添加了pullProgressView
作为子视图。
这样我就不必依赖过渡代表,而是可以在我完成动画制作之后自行解除子视图控制器的问题。