gpt4 book ai didi

ios - UICollectionView InteractiveTransitionToCollectionViewLayout 崩溃并出现异常

转载 作者:行者123 更新时间:2023-11-29 02:53:11 24 4
gpt4 key购买 nike

我有一个带有水平 collectionView 的 collectionViewController,就像在 Paper App 中一样。我添加了平移手势以从一种布局更改为另一种布局,并且我使用了交互式过渡。如果您在动画完成时拖动并等待,效果很好,但如果您拖动得更快并且不等待动画完成或取消应用程序抛出异常:

Assertion failure in -[UICollectionView _finishInteractiveTransitionShouldFinish:finalAnimation:], /SourceCache/UIKit_Sim/UIKit-2935.137/UICollectionView.m:2691 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the collection was not prepared for an interactive transition. see startInteractiveTransitionToCollectionViewLayout:completion:'

手势处理程序代码:

- (void)oneFingerGesture:(UIPanGestureRecognizer *)sender
{

if (sender.state == UIGestureRecognizerStateEnded ||
sender.state == UIGestureRecognizerStateCancelled)
{
if (self.transitionLayout.transitionProgress > 0.2) {
[self.collectionView finishInteractiveTransition];
} else {
[self.collectionView cancelInteractiveTransition];
}
}else
{
CGPoint point = [sender locationInView:sender.view];

if (sender.state == UIGestureRecognizerStateBegan && !self.transitionLayout && !_isInTransition)
{
invertPan = self.largeLayout == self.collectionView.collectionViewLayout;

UICollectionViewLayout *toLayout = invertPan ? self.smallLayout : self.largeLayout;

self.transitionLayout = [self.collectionView startInteractiveTransitionToCollectionViewLayout:toLayout
completion:^(BOOL completed, BOOL finish) {
self.transitionLayout = nil;
_isInTransition = NO; }];


self.initialTapPoint = point;
_isInTransition = YES;

}else if(sender.state == UIGestureRecognizerStateChanged && self.transitionLayout && _isInTransition)
{
CGFloat distance = _initialTapPoint.y - point.y;
if (invertPan) {
distance = -distance;
}
CGFloat dimension = self.collectionView.bounds.size.height - 200;
CGFloat progress = MAX(MIN(((distance)/ dimension), 1.0), 0.0);
[self.transitionLayout setTransitionProgress:progress];

}
}
}

最佳答案

文档指出,调用 finishInteractiveTransition:cancelInteractiveTransition: 将分别安装过渡将要到达和离开的布局对象。然而,这似乎不会立即发生。因此,如果触发和驱动过渡的手势可以快速连续发生,则在调用两种方法之一结束过渡之前检查当前布局是否为 UICollectionViewTransitionLayout 或其子类是不够的。

我通过引入 BOOL ivar (_isFinishingOrCancellingTransition) 来解决这个问题,以避免结束已经在结束过程中的转换:

if (_isFinishingOrCancellingTransition) return;

if (!self.transitionLayout) return;
if (self.collectionView.collectionViewLayout != self.transitionLayout) return;

_isFinishingOrCancellingTransition = YES;

if (self.transitionLayout.transitionProgress > 0.5)
{
[self.collectionView finishInteractiveTransition];
}
else
{
[self.collectionView cancelInteractiveTransition];
}

然后在转换完成时重置 BOOL:

self.transitionLayout = [self.collectionView startInteractiveTransitionToCollectionViewLayout:toLayout completion:^(BOOL completed, BOOL finish) {
self.transitionLayout = nil;
_isFinishingOrCancellingTransition = NO;
}];

关于ios - UICollectionView InteractiveTransitionToCollectionViewLayout 崩溃并出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24240229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com