如何在动画CALayer shadowPath属性期间禁用用户交互

时间:2013-08-02 10:08:23

标签: ios caanimation

我的项目使用UICollectionViewUICollectionViewCell可以通过触摸来展开/折叠。对于这个函数,我正在观察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;
}

2 个答案:

答案 0 :(得分:0)

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

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

这样你可以确保一切都停止,直到blockingMethod完全执行。然而,你的概念方法并不是很好,因为没有用户希望它的UI被阻止,特别是当没有某种等待屏幕时。

参考:

– performSelectorOnMainThread:withObject:waitUntilDone:

此致

hris.to

答案 1 :(得分:0)

在我的情况下,建议的任何解决方案均无用。我的应用程序基于导航控制器。

在设置动画之前解决了崩溃问题,请在导航控制器视图上关闭用户交互。

self.navigationController.view.userInteractionEnabled = false;