gpt4 book ai didi

ios - UIView transform.scaleBy 动画不工作

转载 作者:行者123 更新时间:2023-11-28 09:23:13 28 4
gpt4 key购买 nike

我在 Objective C 中为 iOS 做一些业余爱好者编程,但在 Apple 过渡到 Swift 前后退出了。最近开始尝试学习 Swift,并拼凑了一个非常简单的应用程序来开始理解它。

我有一个以 UIView 和三个按钮开头的屏幕,如图所示。 “Grow it”按钮旨在使 View (redBox) 放大,而“Shrink it”按钮则相反。 “更改颜色”按钮将 redBox 的背景颜色更改为随机颜色。所有更改都旨在使用 UIView.animate(withDuration: 2, animations:

进行动画处理

颜色变化有效,但缩放无效。希望有人能告诉我哪里出错了。

这是代码,感谢所有帮助:

import UIKit
import CoreGraphics

public extension UIColor {
public static var random: UIColor {
let max = CGFloat(UInt32.max)
let red = CGFloat(arc4random()) / max
let green = CGFloat(arc4random()) / max
let blue = CGFloat(arc4random()) / max

return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
}

class ViewController: UIViewController {

@IBOutlet weak var redBox: UIView!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}



@IBAction func growBox(_ sender: UIButton) {
UIView.animate(withDuration: 2, animations: {
self.redBox.transform.scaledBy(x: 1.1, y: 1.1)
},completion: nil)
}



@IBAction func shrinkIt(_ sender: UIButton) {
UIView.animate(withDuration: 2, animations: {
self.redBox.transform.scaledBy(x: 0.9, y: 0.9)
},completion: nil)

}



@IBAction func changeColor(_ sender: UIButton) {
UIView.animate(withDuration: 2, animations: {
self.redBox.backgroundColor = UIColor.random
}, completion: nil)
}

}

编辑 1:

根据下面的回答,我将转换代码更改为:

@IBAction func growBox(_ sender: UIButton) {
UIView.animate(withDuration: 2, animations: {
self.redBox.transform = self.redBox.transform.scaledBy(x: 1.05, y: 1.05)
},completion: nil)
}



@IBAction func shrinkIt(_ sender: UIButton) {
UIView.animate(withDuration: 2, animations: {
self.redBox.transform = self.redBox.transform.scaledBy(x: 0.95238, y: 0.95238)
},completion: nil)

}

虽然这似乎可行,但“收缩”转换会留下一些痕迹,如下所示:

enter image description here

有人知道这是什么意思吗?

最佳答案

您在这里犯的错误是您认为 scaledBy 会更改 transform 属性。

事实并非如此。 Swift 中的方法名称实际上可以告诉你它们是否会改变调用它们的对象!查看它是如何命名为 scaledBy(带有 d)而不是 scaleBy。这表明此方法将返回一个新的缩放转换。因为在英语中,你会这样说:

I would like this view's transformation to be this particular transformation, but scale***d*** by a factor of 2

在代码中你可以这样写:

thisView.transform = thisParticularTransformation.scaledBy(x: 2, y: 2)

这就是应该使用 scaledBy 的方式。

如果您想将 View 的转换更改为绝对转换(而不是相对于另一个转换),您需要创建一个新的 CGAffineTransform:

self.redBox.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)

关于ios - UIView transform.scaleBy 动画不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781313/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com