【发布时间】:2018-02-07 14:42:05
【问题描述】:
我正在使用UIViewControllerAnimatedTransitioning 和UIPercentDrivenInteractiveTransition 以交互方式关闭模态呈现的视图控制器。没什么太花哨的。但是我注意到在交互开始时偶尔会出现一个小故障。如果使用.curveEaseOut 选项进行动画处理,它会变得更加明显。我正在关注的一些在线教程(https://www.thorntech.com/2016/02/ios-tutorial-close-modal-dragging/)也会发生同样的事情。当我第一次向下拖动时,您可以看到 gif 中的故障。有什么建议吗?
MyDismissAnimator
class SlideInDismissAnimator: NSObject, UIViewControllerAnimatedTransitioning {
// ...
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let toVC = transitionContext.viewController(forKey: .to),
let presentedVC = transitionContext.viewController(forKey: .from) else {return}
let presentedFrame = transitionContext.finalFrame(for: presentedVC)
var dismissedFrame = presentedFrame
dismissedFrame.origin.y = transitionContext.containerView.frame.size.height
transitionContext.containerView.insertSubview(toVC.view, belowSubview: presentedVC.view)
}
let duration = transitionDuration(using: transitionContext)
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: {
presentedVC.view.frame = dismissedFrame
}) { _ in
if transitionContext.transitionWasCancelled {
toVC.view.removeFromSuperview()
}
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
}
}
我的交互者
class SwipeInteractionController: UIPercentDrivenInteractiveTransition {
var interactionInProgress = false
private var shouldCompleteTransition = false
private weak var viewController: UIViewController!
init(viewController: UIViewController) {
self.viewController = viewController
super.init()
let gesture = UIPanGestureRecognizer(target: self, action: #selector(handleGesture(_:)))
viewController.view?.addGestureRecognizer(gesture)
}
@objc func handleGesture(_ gestureRecognizer: UIPanGestureRecognizer) {
let translation = gestureRecognizer.translation(in: gestureRecognizer.view!.superview!)
var progress = (translation.y / viewController.view.bounds.height)
progress = CGFloat(fminf(fmaxf(Float(progress), 0.0), 1.0))
switch gestureRecognizer.state {
case .began:
interactionInProgress = true
viewController.dismiss(animated: true, completion: nil)
case .changed:
shouldCompleteTransition = progress > 0.3
update(progress)
case .cancelled:
interactionInProgress = false
cancel()
case .ended:
interactionInProgress = false
if shouldCompleteTransition {
finish()
} else {
cancel()
}
default:
break
}
}
}
【问题讨论】:
-
您是从后台线程调用
animateTransition函数吗?你能确定它是从主线程调用的吗? -
@Honey,
animateTransition在dismiss animator中,由UIKit自动调用。所以我想这不是问题吗?让我知道你认为应该怎么做 -
哈哈。我认为这是您自己编写的函数。我的错。不,这不是问题。只需确保:您没有在 Xcode 上启用慢速动画吗?为了避免模拟器>>调试>>慢动画...
-
不,我现在什至无法在 Xcode 中找到该选项
-
它在模拟器应用上,而不是 xcode...
标签: ios swift modalviewcontroller interactive