首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >iphone :动画停止时移除CALayer,消失前CALayer闪存

iphone :动画停止时移除CALayer,消失前CALayer闪存
EN

Stack Overflow用户
提问于 2012-05-15 14:06:15
回答 1查看 4.6K关注 0票数 14
  • 在XCode
  • set视图中创建一个简单的项目来接收多点触摸事件
  • 在touchesBegan中的响应,创建CALayer当检测到触摸事件时
  • 为CALayer
  • 制作不透明淡出动画,当动画停止时,从父H 210F 211中删除CALayer>

预期: CALayer正常消失

实际情况:消失前的CALayer闪光灯(眨眼)

完整源代码:

代码语言:javascript
代码运行次数:0
运行
复制
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.view.multipleTouchEnabled = YES;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch* touch in touches) {
        CGPoint p = [touch locationInView:self.view];

        //NSLog(@"touch=%@ p=%@", touch, NSStringFromCGPoint(p));

        CALayer *layer = [CALayer layer];
        layer.position = p;
        layer.bounds = CGRectMake(0, 0, 70, 70);
        layer.cornerRadius = 30;
        layer.masksToBounds = NO;
        layer.backgroundColor = [UIColor colorWithRed:102.0/255.0 green:156.0/255.0 blue:255.0/255.0 alpha:0.8].CGColor;
        layer.shouldRasterize = YES;

        CABasicAnimation *fadeOutAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
        fadeOutAnimation.fromValue = [NSNumber numberWithFloat:1.0];
        fadeOutAnimation.toValue = [NSNumber numberWithFloat:0.0];
        fadeOutAnimation.duration = 0.5;
        fadeOutAnimation.delegate = self;
        fadeOutAnimation.removedOnCompletion = NO;
        [fadeOutAnimation setValue:layer forKey:@"parentLayer"];
        [layer addAnimation:fadeOutAnimation forKey:@"opacity"];

        [self.view.layer addSublayer:layer];
    }
}

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    if(flag) {
        CALayer *layer = [theAnimation valueForKey:@"parentLayer"];
        if(layer) {
            layer.opaque = NO;
            layer.opacity = 0.0;
            //layer.hidden = YES;
            //NSLog(@"The layer object was: %@ (%@)", layer, [layer name]);
            [layer removeFromSuperlayer];
            [layer removeAllAnimations];
        }
    }
}

@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-16 07:59:58

tl;dr:将动画上的fillMode设置为kCAFillModeForwards,或者在将动画添加到层之前将值更改为其最终值。

一个基本的动画只是一个视觉动画,在动画的时间内,没有实际的值被改变。当您将动画设置为完成后不移除时,这意味着该层仍然将该动画对象作为其动画之一引用。然而,它已经运行了它的动画。

动画外观的默认行为(它们的填充模式)是kCAFillModeRemoved,这意味着在动画持续时间之后,图层看起来就好像动画从未发生过一样。通过将填充模式更改为kCAFillModeForwardskCAFillModeBoth,您可以使该层看起来像是处于动画的结束状态。

您可以在使用kCAFillModeBackwards的动画开始时做同样的事情,但是当您为动画设置了一个开始时间时,它通常适用。

因此,要使动画看起来像在动画的最后状态中一样,可以将填充模式设置为...Forwards,而不是删除动画,或者在将动画添加到视图之前将图层的实际值更改为您期望的值。这将改变值,然后从旧值变为新值。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10602505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档