簡體   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