swift - 为什么我的 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)
}
}
解决方案
大小会重置,因为 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)
}
您还可以设置fillMode
to.forwards
和isRemovedOnCompletion
to 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)
}
推荐阅读
- traefik - 使用 traefik 重写内容 URL
- unity3d - Unity 2018.1 中的物质
- xml - 序列化 XML 嵌套在自动生成的 Java 类中
- python - matplot pie:水平旋转标签
- javascript - 如何覆盖 react-chartist 组件中的样式?
- sql - 如何在没有事务的情况下使用 SET XACT_ABORT ON
- airflow - Apache气流回填自动日期
- node.js - 方法中带有 Promise 的 NodeJS 类
- php - 如何检索选定年份的数据
- javascript - 样式在 Mozilla Firefox 中不起作用