ios - 将变量设置为等于 View 的框架,而当 View 的框架更改时,值不会更改

标签 ios swift variables swift4 cgrect

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

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/

相关文章:

python - 在Python中的两个函数之间传递字符串变量

ios - SwiftUI 如何实现暗模式切换并刷新所有 View

ios - NSManagedObjectContext 扩展中的通用函数中的奇怪 Swift 行为

java - 访问 Websphere 变量

ios - 将自定义键/字符串对添加到 root.plist 文件是否安全?

ios - 包含在 Swift 中放置在自己的方法中时语法不同的地方

php - 如何将数组值转换为变量?

ios - 为什么我的 UIPasteboard 代码不起作用?

ios - ID 的核心数据可转换 NSArray

ios - 我在 appDelegate 中收到错误?