0

我的项目使用UICollectionView并且UICollectionViewCell可以通过触摸它来展开/折叠。对于此功能,我正在观察contentView.frame属性并调整子视图的大小,并且效果很好。

问题从UICollectionViewCell使用CALayer. 所以我必须用CAAnimation同一个单元格的框架来调整阴影的大小。

但是CAAnimation,当我在动画期间触摸单元格重复时,会导致错误的访问崩溃。

当然,我尝试过使用userInteractionEnabled属性和动画委托,但它不起作用。

谁有什么想法?

观察代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([self.contentView isEqual:object]) {
        // Change subviews frame
        // Code....

        // Shadow Path
        self.userInteractionEnabled = NO;

        CGPathRef newShadowPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:kCornerRadius].CGPath;
        NSArray *animationKeys = [self.layer animationKeys];

        if ([animationKeys count]&&[[animationKeys objectAtIndex:0] isKindOfClass:[NSString class]]) {

            NSString *animationKey = [animationKeys objectAtIndex:0];
            CAAnimation *animation = [self.layer animationForKey:animationKey];

            CABasicAnimation *newAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
            newAnimation.duration = animation.duration;
            newAnimation.toValue = [NSValue valueWithPointer:newShadowPath];
            newAnimation.timingFunction = animation.timingFunction;
            newAnimation.delegate = self;
            newAnimation.removedOnCompletion = NO;

            [self.layer addAnimation:newAnimation forKey:@"shadowPath"];
        }
        self.layer.shadowPath = newShadowPath;
    }
}

和动画代表在这里:

#pragma mark - CAAnimation delegate
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    self.userInteractionEnabled = YES;
}
4

2 回答 2

0

如果您想停止任何用户交互(实际上您将停止一切),请使用阻塞主线程选择器调用您的问题方法:

    [self performSelectorOnMainThread:@selector(blockingMethod:) withObject:blockingMethodParam waitUntilDone:YES]

这样你就可以确保一切都停止,直到blockingMethod完全执行。但是,您的概念方法不是很好,因为没有用户希望它的 UI 被阻止,尤其是在没有某种等待屏幕的情况下。

参考:

– performSelectorOnMainThread:withObject:waitUntilDone:

问候,

历史

于 2013-12-21T15:34:51.240 回答
0

建议的解决方案都不适用于我的情况。我的应用程序是基于导航控制器的。

在动画之前关闭导航控制器视图上的用户交互性修复了崩溃问题。

self.navigationController.view.userInteractionEnabled = false;
于 2018-06-22T19:01:39.940 回答