我想知道帧在改变之前的原始值。为此,我想到了这一点:
var baseViewOriginalFrame: CGRect!
func changeFrame() {
baseViewOriginalFrame = boxView.frame
boxView.transform = CGAffineTransform.identity.translatedBy(x: 0, y: +5)
}
我注意到原始框架实际上是 boxView 的当前框架,所以我阅读了 Setting a variable equal to another variable ,并了解到 originalFrame 变量只是存储对象的位置。
那么我怎样才能做到这一点(保存 boxView 的原始框架)?
最佳答案
这归结为引用 类型和值 类型之间的区别。
在 Swift 中,当您有一个值类型的变量(链接 Ints、Strings 等)时,该变量将保存该值。当您有一个引用类型的变量(例如类)时,它会在内存中保存对该对象的引用。
这意味着当您传递一个值类型变量时,您传递的是该变量包含的实际数据。但是,当您传递引用类型变量时,您传递的是对该对象的引用。
看下面的代码片段,你可以看到当你复制一个值类型时,你得到了它的一个实际副本。当您制作引用类型的副本时,您只会获得对内存中同一对象的另一个引用,这意味着任何更改都会反射(reflect)在另一个变量中,因为它们都引用同一个对象。
// 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)
希望对您有所帮助, 雅各布。
关于ios - 将变量设置为等于 View 的框架,而当 View 的框架更改时,值不会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57300766/