带有动画的文本字段四边形边框

Text field four-sided border with animation

我想在用户单击内部时突出显示文本字段的四边边框,并在用户编辑结束时恢复原状。为了实现这一点,我在我的文本字段的 editingDidBegin 函数中有以下代码片段。

func pulseBorderColor() {
    let pulseAnimation = CABasicAnimation(keyPath: "borderColor")
    pulseAnimation.duration = 0.35
    pulseAnimation.fromValue = UIColor.green.cgColor
    pulseAnimation.toValue = UIColor(red: 252/255, green: 180/255, blue: 29/255, alpha: 1.0).cgColor
    pulseAnimation.fillMode = kCAFillModeForwards
    pulseAnimation.isRemovedOnCompletion = false
    pulseAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    nationalIdentityTextField.layer.sublayers![0].add(pulseAnimation,forKey: nil)
}

为了恢复我的文本字段颜色,我在文本字段 editingDidEnd 函数中有以下代码

func reversePulseBorderColor() {
    let pulseAnimation = CABasicAnimation(keyPath: "borderColor")
    pulseAnimation.duration = 0.35
    pulseAnimation.fromValue = UIColor(red: 252/255, green: 180/255, blue: 29/255, alpha: 1.0).cgColor
    pulseAnimation.toValue = UIColor.green.cgColor
    pulseAnimation.fillMode = kCAFillModeForwards
    pulseAnimation.isRemovedOnCompletion = false
    pulseAnimation.timingFunction = CAMediaTimingFunction(name:  kCAMediaTimingFunctionEaseInEaseOut)
    nationalIdentityTextField.layer.sublayers![0].add(pulseAnimation,forKey: nil)
}

然而,它并没有达到我想要的效果。可能是什么原因,我该如何解决?

我认为您应该将 keyPath 设置为相关文本字段的层,而不是 CABasicAnimation 并且您还需要将 borderWidth 设置为至少 1 才能使颜色可见。

下面是我尝试修改上面的代码并让它工作的方法

 func pulseBorderColor() {
        let pulseAnimation = CABasicAnimation(keyPath: nil)
        pulseAnimation.duration = 0.35
        pulseAnimation.fromValue = UIColor.green.cgColor
        pulseAnimation.toValue = UIColor(red: 252/255, green: 180/255, blue: 29/255, alpha: 1.0).cgColor
        pulseAnimation.fillMode = CAMediaTimingFillMode.forwards
        pulseAnimation.isRemovedOnCompletion = false
        pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
        txtInput.layer.add(pulseAnimation, forKey: "borderColor")
    }

 func reversePulseBorderColor() {
        let pulseAnimation = CABasicAnimation(keyPath: nil)
        pulseAnimation.duration = 0.35
        pulseAnimation.fromValue = UIColor(red: 252/255, green: 180/255, blue: 29/255, alpha: 1.0).cgColor
        pulseAnimation.toValue = UIColor.green.cgColor
        pulseAnimation.fillMode = CAMediaTimingFillMode.forwards
        pulseAnimation.isRemovedOnCompletion = false
        pulseAnimation.timingFunction = CAMediaTimingFunction(name:  CAMediaTimingFunctionName.easeInEaseOut)
        txtInput.layer.add(pulseAnimation, forKey: "borderColor")
    }

要设置 borderWidth,您可以像这样在代码中设置它

txtInput.layer.borderWidth = 1

或在身份检查器中的用户定义的运行时属性中。

希望对您有所帮助。