繁体   English   中英

设置变量等于视图的框架,而视图的框架更改时该值不变

[英]Set a variable equal to a view's frame without the value changing when view's frame changes

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

var baseViewOriginalFrame: CGRect!

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

我注意到原始框架实际上是boxView的当前框架,因此我阅读了将Setting变量设置为与另一个变量相等的方法 ,并了解到originalFrame变量仅存储对象的位置。

那么如何实现这一点(保存boxView的原始框架)?

这归结为引用类型和类型之间的差异。

在Swift中,当您拥有一个值类型的变量(链接整数,字符串等)时,该变量将保存该值。 当您拥有作为引用类型的变量(例如,Class)时,它将在内存中保存对该对象的引用

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM