设置一个等于视图框架的变量,当视图的框架更改时,值不会改变



我想在更改帧的原始值。为此,我想到了:

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

我注意到原始帧实际上是BoxView的当前帧,因此我读了设置一个与另一个变量相等的变量,并了解到原始框架变量只是存储对象的位置。

,我该如何实现此目标(保存BoxView的原始帧(?

这取决于参考类型和 value types。

之间的差异。

在Swift中,当您具有一个值类型(链接INTS,字符串等(的变量时,则该变量将具有该值。当您具有一个参考类型(例如类(的变量时,则将其参考保存到内存中的对象。

这意味着,当您将值类型变量传递时,您将传递该变量所包含的实际数据。但是,当您传递参考类型变量时,您将传递对该对象的引用。

进行以下代码段,您可以看到,当您制作一个值类型的副本时,您会获得其实际副本。当您制作参考类型的副本时,您只需在内存中获得另一个对相同对象的引用,这意味着任何更改都反映在其他变量中,因为它们都引用了相同的对象。

// 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)

现在,对于您的特定示例,我对为什么不起作用感到困惑,因为从我可以看到的是一个struct,这是一个值类型,因此以您的方式制作副本,。实际上,我只是在我的一个应用程序中添加了您必须在方法的末尾的代码,并且它正好奏效:

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)

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

最新更新