【问题标题】:Set a variable equal to a view's frame without the value changing when view's frame changes设置一个等于视图框架的变量,当视图的框架改变时,值不会改变
【发布时间】:2019-12-09 13:31:54
【问题描述】:

我想知道一帧在改变之前的原始值。为此,我想到了这个:

var baseViewOriginalFrame: CGRect!

func changeFrame() {
   baseViewOriginalFrame = boxView.frame
   boxView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
}

我注意到原来的frame其实就是boxView的当前frame,于是看了Setting a variable equal to another variable,了解到originalFrame变量只是存储了对象的一个​​位置。

那么我该如何实现(保存boxView的原始框架)?

【问题讨论】:

    标签: ios swift variables swift4 cgrect


    【解决方案1】:

    这归结为 reference 类型和 value 类型之间的区别。

    在 Swift 中,当您有一个值类型的变量(链接 Ints、Strings 等)时,该变量会保存该值。当您有一个引用类型的变量(例如一个类)时,它会在内存中保存对该对象的 引用

    这意味着当你传递一个值类型变量时,你传递的是变量所保存的实际数据。但是,当您传递引用类型变量时,您传递的是对该对象的引用。

    拿下面的代码sn-p,你可以看到,当你复制一个值类型时,你得到了它的一个实际副本。当你复制一个引用类型时,你只会得到另一个对内存中相同对象的引用,这意味着任何更改都会反映在另一个变量中,因为它们都引用了同一个对象。

    // Structs are a VALUE type
    struct myStruct {
        var value: Int
    
        init(x: Int) {
            self.value = x
        }
    }
    
    // Classes are a REFERENCE type
    class myClass {
        var value: Int
    
        init(x: Int) {
            self.value = x
        }
    }
    
    var a = myStruct(x: 5)
    var originalA = a       // This has made a copy of a, and stores it in originalA
    a.value = 100
    
    print(originalA.value)
    print(a.value)
    
    var b = myClass(x: 5)
    var originalB = b       // This is still referencing the same object as the variable b.
    b.value = 100
    
    print(originalB.value)
    print(b.value)
    

    现在至于您的具体示例,我对它为什么不起作用感到困惑,因为从我可以看到 CGRect 是一个结构,它是一种值类型,因此按照您的方式制作副本应该可以正常工作.事实上,我只是在我的一个应用程序的方法末尾添加了你必须的代码,它的工作方式完全符合你的预期:

    let x = textView.frame
    textView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
    print(x)   // Prints (16.0, *83.0*, 343.0, 564.0)
    print(textView.frame) // Prints (16.0, *88.0*, 343.0, 564.0)
    

    希望这会有所帮助, 雅各布。

    【讨论】:

    • 感谢您的解释,嗯,是的,它不起作用很奇怪。让我重新检查一下我的代码,看看我是否能发现问题,现在我会进一步调查问题。
    • 好的,很高兴更新它实际上是我的错误......我调用了错误的函数哈哈哈!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多