我正在关注this tutorial以了解如何为UIViewControllers进行交互式转换。
一切正常,但我发现了一些闪烁。
当您从右向左拖动屏幕时,我发现了第一个闪烁。这是因为平移手势将识别每次拖动并运行panned(_:)
方法,并将弹出或执行segue来更改控制器。我修复了id添加委托方法gestureRecognizerShouldBegin(_:)
。
这确保了如果从右向左拖动,则手势永远不会开始(.Begin
)。
但现在我有一个不同的问题。如果我从左向右拖动(按预期)但不中断拖动,则从右向左改变方向,应取消转换。在这种情况下,我可以在再次出现旧控制器之前看到新控制器的短暂闪烁。
如何优雅地取消交互式动画?
This is a video试图表明问题。我找不到减慢这个动画速度的方法,所以它非常快。
修改
我尝试了两种不同的方法。
This one使用CABasicAnimation
为转换设置动画。 And this one使用animateWithDuration(_:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)
每当我拨打cancelInteractiveTransition
答案 0 :(得分:0)
这是我解决问题的方法:
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
[UIView animateWithDuration:[self transitionDuration:transitionContext]
delay:self.interactive?[self transitionDuration:transitionContext]:0 // If zero, the animation briefly flashes in iOS 11.
options:option
animations:^{
} completion:^(BOOL finished) {
}];
}
最重要的是交互式过渡中的延迟动画
请参见下面的代码:我发现如果我们在dismissViewControllerAnimated:YES
中调用UIGestureRecognizerStateBegan
,如果不延迟动画,动画将立即开始。然后,在UIGestureRecognizerStateChanged
中,updateInteractiveTransition:progress
将将视图移至“前进位置”。似乎是一刹那
switch (sender.state) {
case UIGestureRecognizerStateBegan:
_interactive = YES;
[viewcontroller dismissViewControllerAnimated:YES completion:nil];
break;
case UIGestureRecognizerStateChanged:
[self updateInteractiveTransition:progress];
break;
case UIGestureRecognizerStateEnded:
{
_interactive = NO;
if (shouleFinish) {
[self finishInteractiveTransition];
} else {
[self cancelInteractiveTransition];
}
}
break;
case UIGestureRecognizerStateCancelled:
_interactive = NO;
[self cancelInteractiveTransition];
break;
default:
break;