UIView transform.scaleBy 动画不起作用

Posted

技术标签:

【中文标题】UIView transform.scaleBy 动画不起作用【英文标题】:UIView transform.scaleBy animation not working 【发布时间】:2018-06-10 07:01:16 【问题描述】:

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

我有一个以 UIView 和三个按钮开头的屏幕,如图所示。 “扩大”按钮旨在使视图 (redBox) 放大,而“缩小”按钮则相反。 “更改颜色”按钮将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)


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

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

【问题讨论】:

【参考方案1】:

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

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

我希望这个视图的转换是这个特殊的转换,但是将***d*** 缩放 2 倍

在代码中你可以这样写:

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

这就是scaledBy 的用法。

如果您想将视图的转换更改为绝对转换(与另一个转换无关),您需要创建一个新的CGAffineTransform

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

【讨论】:

谢谢!请参阅上面的编辑,其中我使用了您建议的代码的略微修改版本。 @rattletrap99 所以您希望转换与已经执行的转换相关? 完全正确!每次连续点击增长按钮时都会增长,反之亦然收缩按钮...... @rattletrap99 我看不出你看到了什么。你可以尝试在另一个模拟器或真机上运行它吗? 我猜这可能是模拟器问题。我会在早上尝试一些不同的。非常感谢您的帮助,但现在是凌晨 2 点 18 分,灯熄灭了。明天我会回复你一些结果。再次感谢!【参考方案2】:

你可以试试这个:

@IBAction func growBox(_ sender: UIButton) 
    UIView.animate(withDuration: 2, animations: 
        self.redBox.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
    , completion: nil)

【讨论】:

【参考方案3】:

您只是没有更改转换,这就是它不起作用的原因

您应该创建新的 AffineTransform 对象并分配给它。

替换

self.redBox.transform.scaledBy(x: 1.1, y: 1.1)

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

【讨论】:

【参考方案4】:
@IBAction func growBox(_ sender: Any) 
    UIView.animate(withDuration: 2, animations: 
        self.redView.transform = self.redView.transform.scaledBy(x: 1.1, y: 1.1)
    ,completion: nil)

【讨论】:

虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。

以上是关于UIView transform.scaleBy 动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果其他 UIView 带有隐藏选项,如何使下 UIView 固定到 UIScrollView 中的上 UIView?

在 UIView2 上方显示 UIView1,但在 UIView1 上方显示 UIView2 输入方式

统计从多个 UIView 中随机抽出的 UIView 数量,即:从 9 个 UIView 中随机抽出 5 个 UIView,然后执行操作

UIView 类别 - 自定义方法不返回 UIView

IOS将UIVIew中的UIImageView扁平化为单个UIView [重复]

UIView - 啥覆盖将允许更新 UIView 框架