我想在我的项目中复制这个动画
所以我尝试的是:
转换比例X ..但问题是它还缩小了按钮的标题。
self.transform = CGAffineTransform.identity
UIView.animate(withDuration: duration, delay: delayTime,
usingSpringWithDamping: 0.7,
initialSpringVelocity: 0.7,
options: [.curveEaseIn],
animations: {
self.transform = CGAffineTransform(scaleX: 0.5, y: 1.0)
}, completion: nil)
这就是它给出的(按钮标题也缩小)
使用CASpringAnimation
let shrinkAnim = CASpringAnimation(keyPath: "bounds.size.width")
shrinkAnim.damping = 0.7
shrinkAnim.initialVelocity = 0.7
shrinkAnim.fromValue = frame.width
shrinkAnim.toValue = width
shrinkAnim.dura[![enter image description here][3]][3]tion = duration
shrinkAnim.timingFunction = getTimingFunction(curve: curve)
shrinkAnim.fillMode = kCAFillModeForwards
shrinkAnim.isRemovedOnCompletion = false
layer.add(shrinkAnim, forKey: shrinkAnim.keyPath)
所以我的问题是出了什么问题或者我需要添加什么来复制第一张图片?
我对按钮的约束固定在左边,右边和底边并固定高度。更多的事情是我正在为此做一个类,所以我不能改变常量,因为我必须在许多屏幕中使用它..所以我想要一站式解决方案。
答案 0 :(得分:1)
将您的按钮放在UIView
中您的视图树将如下所示
Superview> UIView>按钮
通过这样做,您现在可以使用按钮可以遵循的固定宽度尺寸,即uiview
看起来像这样
https://feedback.azure.com/forums/34192--general-feedback
然后使用
制作动画//let's say the current left and right constraint are 8
leftConstraint.constant = 50
rightConstraint.constant = 50
UIView.animate ... {
self.view.layoutIfNeeded()
}
通过使用此功能,您只需将UIView的画面设置为所需的画面并按下按钮,您的动画就会与您编码的方式成比例设置<\ n / p>
//let's say the current left and right constraint are 8
// get view frame
...
// calculate distance
var calculatedDistance = ......
// set distance
let distanceToAnimate = calculatedDistance
leftConstraint.constant = distanceToAnimate
rightConstraint.constant = distanceToAnimate
UIView.animate ... {
self.view.layoutIfNeeded()
}
答案 1 :(得分:0)
请勿使用Javascript
,而是使用按钮CGAffineTransform
的{{1}}属性出口,并在动画块/闭包内更改其NSLayoutConstraint
。
width
答案 2 :(得分:0)
答案 3 :(得分:0)
在按钮的框架上应用变换。当您在动画中缩放UIView时,它不会考虑子视图/布局,它只会统一缩放所绘制的内容。
self.transform = CGAffineTransform.identity
UIView.animate(withDuration: duration, delay: delayTime,
usingSpringWithDamping: 0.7,
initialSpringVelocity: 0.7,
options: [.curveEaseIn],
animations: {
self.frame = CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)
}, completion: nil)