首页 > 解决方案 > 为什么我的 Swift 按钮动画会变回原尺寸?

问题描述

的期望:当我按下按钮时,它会缩小到 75% 并保持在 75% 的缩小尺寸,直到我松开。

发生了什么:按钮缩小到 75%,但是一旦完成动画的持续时间,当我的手指仍然按下按钮时,它就会恢复到原来的值。

当按钮为“按下”时,我被称为以下内容。

import Foundation
import UIKit

extension UIButton {

func shrink() {

    let shrink = CABasicAnimation(keyPath: "transform.scale")
    shrink.fromValue = 1.0
    shrink.toValue = 0.75
    shrink.duration = 0.5
    shrink.isRemovedOnCompletion = false
    layer.add(shrink, forKey: nil)

   }
 }

标签: swift

解决方案


大小会重置,因为 CABasicAnimation 不会更新层的底层值,只会更新表示层。因此,当动画结束时,它会返回使用基础值。

处理这个问题的最好方法是在动画开始之前设置变换比例,以便在结束时它是正确的值。

func shrink() {
    transform = CGAffineTransform(scaleX: 0.75, y: 0.75) // Set final state

    let shrink = CABasicAnimation(keyPath: "transform.scale")
    shrink.fromValue = 1.0
    shrink.toValue = 0.75
    shrink.duration = 0.5
    layer.add(shrink, forKey: nil)

}

您还可以设置fillModeto.forwardsisRemovedOnCompletionto false,这将使表示层保持不变,但这不会更新层的实际比例,因此按钮将保留原始比例以进行点击检测。(您需要像上面那样设置变换的比例来纠正它。)

func shrink() {
    let shrink = CABasicAnimation(keyPath: "transform.scale")
    shrink.fromValue = 1.0
    shrink.toValue = 0.75
    shrink.duration = 0.5
    shrink.isRemovedOnCompletion = false
    shrink.fillMode = .forwards
    layer.add(shrink, forKey: nil)
}

您还可以使用具有相同视觉效果的视图动画,但也可以更新比例:

UIView.animate(withDuration: 0.5) { [weak self] in
    self?.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
}

推荐阅读