来自UISlider的CABasicAnimation手册进展

时间:2013-12-14 12:52:25

标签: ios core-animation

我正在努力实现一个简单的行为:

使用opacity的值更改CALayer的{​​{1}}。

我想使用UISlider来做到这一点,我现在写的内容效果很好但是当滑块的值为1.0时,不透明度会变回0.0,而应该是1.0(最终请求的值) )。

以下是代码:

CABasicAnimation

2 个答案:

答案 0 :(得分:4)

这就是timeOffset的工作原理。持续时间保持不变,只是所有的值都在转移。

你所谈论的效果可以(如果我没记错的话)用负beginTime来实现。

答案 1 :(得分:2)

您没有使用CABasicAnimation指定要显式动画的原因。这里没有必要假设您只是想要为图层不透明度设置动画。您可以直接在animatedView的图层上设置不透明度来使用隐式动画:

- (IBAction)sliderDidChangeValue:(id)sender
{
    CGFloat value = ((UISlider*)sender).value;
    self.animatedView.layer.opacity = value;
}

尽管如此,您应该知道它实际上不会执行动画,因为您正在使用视图的根层。而是将另一个图层添加到视图层次结构中,并隐式地为其设置不透明度。

首先添加您要制作动画的子图层

- (void)viewDidLoad
{
    [super viewDidLoad];

    _animatedLayer = [CALayer layer];
    _animatedLayer.position = CGPointMake(200.0f, 200.0f);
    _animatedLayer.bounds = CGRectMake(0.0f, 0.0f, 200.0f, 300.0f);
    _animatedLayer.backgroundColor = [[UIColor orangeColor] CGColor];

    [self.view.layer addSublayer:_animatedLayer];

}

然后,当滑块发生变化时,通过直接设置值隐式更改变化并将更改包装在CATransaction中,以便您可以控制动画持续时间。

- (IBAction)sliderDidChange:(id)sender
{
    [CATransaction begin];
    [CATransaction setAnimationDuration:1.0f];
    self.animatedLayer.opacity = [(UISlider*)sender value];
    [CATransaction commit];

}

请记住,当您在动画中设置属性时,实际不是在图层中设置值,而只是在动画中显示它。如果要保留图层中的值,则必须实际设置该值。这就是为什么使用隐式动画并直接设置属性有时是可取的。

我向Github发布了一个快速项目:https://github.com/perlmunger/FadeViewOpacity.git

如果这不是您想要的,请告诉我。我不完全确定我理解你要解决的问题。