我正在努力实现一个简单的行为:
使用opacity
的值更改CALayer
的{{1}}。
我想使用UISlider
来做到这一点,我现在写的内容效果很好但是当滑块的值为1.0时,不透明度会变回0.0,而应该是1.0(最终请求的值) )。
以下是代码:
CABasicAnimation
答案 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
如果这不是您想要的,请告诉我。我不完全确定我理解你要解决的问题。