我的项目使用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;
}
答案 0 :(得分:0)
如果你想停止任何用户交互(实际上你会停止一切)用阻塞主线程选择器调用你的问题方法:
[self performSelectorOnMainThread:@selector(blockingMethod:) withObject:blockingMethodParam waitUntilDone:YES]
这样你可以确保一切都停止,直到blockingMethod完全执行。然而,你的概念方法并不是很好,因为没有用户希望它的UI被阻止,特别是当没有某种等待屏幕时。
参考:
– performSelectorOnMainThread:withObject:waitUntilDone:
此致
hris.to
答案 1 :(得分:0)
在我的情况下,建议的任何解决方案均无用。我的应用程序基于导航控制器。
在设置动画之前解决了崩溃问题,请在导航控制器视图上关闭用户交互。
self.navigationController.view.userInteractionEnabled = false;