0

我有一个视图,用户需要在按钮起作用之前进行选择。为了使这一点更明显,如果首先按下(灰色)按钮,我希望表示需要完成的选择的元素闪烁。即,我想指出这是该状态下的错误,并将用户的注意力引导到他们首先需要使用的 UI 元素上。

我目前尝试让元素(self.display在下面的代码中)快速闪烁两次如下:

@IBAction func inactiveButtonClick() {
    let period = 0.16

    UIView.animate(withDuration: period/2, delay: 0.0, options: [.curveEaseInOut, .autoreverse, .repeat], animations: {
        self.display.alpha = 0
    }, completion: { _ -> Void in
        self.display.alpha = 1
    })

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + period*2, execute: {
        self.display.layer.removeAllAnimations()
    })

}

这工作得很好,但感觉不是 100% 正确,并且动画有时会在完成之前被截断几分之一秒。我想我可以排队两个动画,但我想知道是否有更简单的方法来完成这个。是否有任何内置方法可以让 UI 元素闪烁以指示错误?如果没有,是否有任何“已知良好”的曲线和频率组合可以将这一点传达给用户?

4

1 回答 1

1

关键帧动画似乎非常适合这种情况:

UIView.animateKeyframes(withDuration: period, delay: 0.0, options: [], animations: {
    UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5, animations: {
        self.display.alpha = 0
    });
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: {
        self.display.alpha = 1
    });
}, completion: nil);

因此,您首先创建一个持续时间为周期的关键帧动画。在动画块内部,您可以通过指定相对开始时间来添加自定义关键帧动画(在 0 到 1 - 1 关键帧动画的结束之间,因此您的持续时间)。

所以首先我们添加从开头开始的动画,它的相对持续时间是 0.5,所以是总动画持续时间的 1/2。第二个动画将在第一个动画总动画的 1/2 处结束时开始,并在剩下的动画时间的 1/2 处继续。

希望这可以帮助

于 2017-10-14T10:13:06.453 回答