gpt4 book ai didi

ios - 如何创建可以在播放时取消和/或还原的延迟 CAAnimation?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:34 25 4
gpt4 key购买 nike

我有一个层,我想在用户执行操作时显示,并在他完成后隐藏。如果用户再次执行该操作,该层将再次显示。

为了让 UI 不因动画而变得疯狂,我想要:

  • 淡出动画仅在一秒后开始(如果用户在开始之前执行该操作,则取消)
  • 如果用户在图层消失之前正在执行操作,则显示图层的淡入淡出动画将从当前淡出不透明度开始

最好的方法是什么?

我试过了,但这不能正常工作(图层闪烁时有很多噪音):

- (void)hideHintLayer:(bool)hide
{
if(hide)
{
CABasicAnimation *animation = [CABasicAnimation animation];
animation.beginTime = CACurrentMediaTime() + 1.0f;
animation.duration = 1.0f;
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
animation.keyPath = @"opacity";
animation.fromValue = @(1.0f);
animation.toValue = @(0.0f);
[layer addAnimation:animation forKey:nil];
}
else
{
layer.opacity = 1.0f;
}
}

最佳答案

如果你想停止动画,你可以这样做

[layer removeAllAnimations];

如果你想知道 View 动画隐藏期间的当前alpha(以便你可以反转动画,从正确的地方开始,你可以这样做:

CALayer *presentationLayer = layer.presentationLayer;
CGFloat startingAlpha = presentationLayer.opacity;

然后您可以将 alpha 设置为从 startingAlpha 到 1.0 以在不闪烁屏幕的情况下动画取消隐藏。

您可以使用基于 block 的动画制作实际动画,或者我想您可以使用 CABasicAnimation,但我不确定您为什么会这样做。


因此,例如,您可以执行如下操作(在我的示例中,我有一个“显示”按钮)。我正在使用 block 动画,但我怀疑它也适用于 CABasicAnimation:

- (IBAction)onPressShowButton:(id)sender
{
[self showAndScheduleHide];
}

- (void)showAndScheduleHide
{
[UIView animateWithDuration:1.0
animations:^{
self.containerView.alpha = 1.0;
}
completion:^(BOOL finished) {
[self scheduleHide];
}];
}

- (void)show
{
[UIView animateWithDuration:1.0
animations:^{
self.containerView.alpha = 1.0;
}
completion:nil];
}

- (void)scheduleHide
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(startToHide)
userInfo:nil
repeats:NO];
}

- (void)startToHide
{
self.timer = nil;

self.hiding = YES;

[UIView animateWithDuration:5.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.containerView.alpha = 0.0;
}
completion:^(BOOL finished) {
self.hiding = NO;
}];
}

然后您可以使用一些实用方法来反转它或重新安排正在进行的隐藏:

- (void)reverseAndPauseHide
{
// if we have a "hide" scheduled, then cancel that

if (self.timer)
{
[self.timer invalidate];
self.timer = nil;
}

// if we have a hide in progress, then reverse it

if (self.hiding)
{
[self.containerView.layer removeAllAnimations];

CALayer *layer = self.containerView.layer.presentationLayer;
CGFloat currentAlpha = layer.opacity;

self.containerView.alpha = currentAlpha;

[self show];
}
}

然后,问题是您何时知道调用此 reverseAndPauseHide 以及何时再次调用 scheduleHide。因此,例如,您可以处理触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];

[self reverseAndPauseHide];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];

[self scheduleHide];
}

关于ios - 如何创建可以在播放时取消和/或还原的延迟 CAAnimation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com