无法控制 UITableViewCell 的子图层的动画时间
Posted
技术标签:
【中文标题】无法控制 UITableViewCell 的子图层的动画时间【英文标题】:Cannot control animation timing of a UITableViewCell's sublayer 【发布时间】:2014-01-25 17:51:42 【问题描述】:CAMediaTiming
协议定义了属性timeOffset
,它应该设置动画或动画层的额外时间偏移。通过设置layer.speed = 0
,可以通过将layer.timeOffset
设置为给定值来手动控制动画时间。
我设法在常规视图中做到这一点,然而当我尝试这样做(设置层的时间偏移)时,当该层是 UITableViewCell 层的后代时,它没有任何效果。
这是一个快速的 sn-p,这样您就可以看到我想要实现的目标和无效的目标。
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[tableView deselectRowAtIndexPath:indexPath animated:NO];
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, 0, 80, 80);
layer.backgroundColor = [UIColor redColor].CGColor;
layer.opacity = .1f;
[cell.contentView.layer addSublayer:layer];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.toValue = (id) [NSNumber numberWithFloat:1.f];
animation.duration = 1.f;
[layer addAnimation:animation forKey:nil];
layer.timeOffset = 0.7f;
layer.speed = 0.f;
【问题讨论】:
只有 timeOffset 不起作用还是你能告诉我们更多关于正在发生的事情? 是的 -CAMediaTiming
协议中定义的所有属性都可以工作,除了 timeOffset
【参考方案1】:
您必须先让动画开始,然后才能控制它的 timeOffset。使用延迟很小的块来执行此操作:
CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"opacity"];
ba.removedOnCompletion = NO;
ba.duration = kAnimationDuration;
ba.autoreverses = YES;
ba.repeatCount = HUGE_VALF;
ba.fromValue = [NSNumber numberWithDouble:kInitialAlpha];
ba.toValue = [NSNumber numberWithDouble:kFinalAlpha];
[self.layer addAnimation:ba forKey:@"opacity"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
double offset = self.alphaOffset * ( kAnimationDuration / kNumAlphaOffsets );
self.layer.timeOffset = offset;
);
【讨论】:
以上是关于无法控制 UITableViewCell 的子图层的动画时间的主要内容,如果未能解决你的问题,请参考以下文章
arcgisserver10.2 多图层属性查询FindTask