2013-05-20 67 views
1

我的視圖控制器中有一個變量CGFloat x。我創建與此變量的幀:根據改變CGFloat的值自動更新CGRect

CGRectMake(x,x,4*x,4*x) 

x改變時,我想幀的值也改變無需任何手動更新。 我該怎麼做?

+6

CGFloat不可變(它甚至不是真正的對象,因爲它分解爲基本類型)。沒有必要對其進行「深層複製」。這個問題可能是這樣的:「我怎樣才能使CGRect動態改變(基於變量)?」 – user2246674

回答

3

沒有方法爲「深拷貝」一個CGFloat,由於CGFloat原始類型,而不是一個對象。此外,CGRect是一個struct,不是一個對象,所以它由一個接一個地存儲的4個CGFloat組成。未提及CGFloat s,但原始值本身。

但是,如果聲明x爲您的視圖控制器的屬性:

@property CGFloat x; 

然後你就可以覆蓋的x二傳手更新您的框的值:

- (void)setX:(CGFloat)x { 
    _x = x; 
    self.myFrame = CGRectMake(x, x, x * 4, x * 4); 
} 

在這方式,每次你改變x使用self.x = whatever,setter方法將被調用,你的框架將被更新。

這基本上是做到這一點的最安全,最可靠的方法,只要你記得設置x通過self.x = whatever,如果直接設置底層伊娃_x,二傳手不會被調用,框架不會更新。

+0

感謝您的回答。但如果有大約50個不同框架的uiviews,那麼我們如何爲每個框架設置框架? – manujmv

+0

有一個你所有'UIView'的數組,並循環遍歷它來爲每一個設置框架。 – Greg

1

你不能製作不可變數據的副本。所以你不能複製CGFloat.But如果你想在這種情況下改變你的框架,你需要在X屬性的setter方法中設置你的框架。