2010-10-15 45 views
3

可以說我想臨時更改視圖的框架(例如,將其向右移動10px--可能與突出顯示更改有關)。這是改變現有視圖的UIView框架的最好方法嗎?

我以爲僞代碼會是這樣的

self.someView.frame.origin.x += 10.0f; 

但是這給了我的

lvalue required as left operand of assignment 

錯誤所以我做什麼,而不是在做一個新的CGRect代表幀,改變該CGRect然後給視圖的CGRect,因爲它的框架

CGRect aFrame = self.someView.frame; 
aFrame.origin.x += 10.0f; 
[self.someView setFrame:aFrame]; 

似乎有趣,我可以m在CGRect上做一個賦值,但不在CGRect的視圖框架上。

那麼,這是改變現有視圖框架的最佳方式嗎?

對於獎勵積分:爲什麼我不能直接在視圖的框架屬性上分配一個新的值,爲什麼我必須擊打這樣的灌木叢呢?

謝謝

回答

5

對於獎勵要點:爲什麼我不能直接在視圖的框架屬性上分配一個新的值,爲什麼我必須擊打這樣的灌木叢呢?

由於點符號用於兩種不同的用例:屬性訪問和結構成員訪問。另一種方式來寫

self.someView.frame.origin.x += 10.0f; 

[[self someView] frame].origin.x += 10.0f; 

這條線使得它更清晰,這是行不通的。[[self someView] frame]檢索CGRect,但如果您要更改此結構的成員,則frame屬性本身的內容不會更改。要將某些內容分配給框架屬性,必須使用-setFrame:方法。並且-setFrame始終需要整個CGRect作爲它的參數。

+0

謝謝Ole。我現在看到,由於視圖的框架屬性設置爲接收CGRect,因此不會設置相同的屬性來了解CGRect的工作原理。矩形只是一個值得傳遞給它的值。如果我將框架放入它自己的var中,那麼它知道CGRects如何工作,以便我可以操縱該結構。燈泡時刻! – davidamcclain 2010-10-17 14:49:45

2

回答這個問題的答案也是獎勵積分。這是關於獲得者的設置者。

self.someView.frame是一個獲得者 - 它返回幀&不會更深。它不允許你進入CGRect並修改值。

這樣:

CGRect r = self.someView.frame; 
r.origin.x += 10.0f; 
self.someView.frame = r; 

這是毫無疑問,混亂,如果從那裏點符號是越來越&設定值,無論背景下的典型方式各種語言中。目標C點符號可能會以未知的方式混淆,因爲Obj-C可以通過點語法調用方法以及獲取屬性值。因此,沒有簡單的方法知道self.someView.frame真的是self.someView.frame()(使用Pythonic語法)。

不要聽起來很討厭(實際上,我每天都在編程Python),但是你真的沒有使用Obj-C的標準消息傳遞語法在灌木叢中跳動。您絕對可以利用點語法來節省自己的一些步驟,但括號內的消息傳遞具有一定的自我記錄幫助,並可幫助您避免此類錯誤。

+0

現在有道理,感謝bobwaycott。我來自Ruby背景,所以我認爲,因爲我可以看到矩陣中的值,所以我可以改變它們。我現在明白爲什麼我不能。感謝您的回答。 – davidamcclain 2010-10-17 14:52:18

0

我已經有了github宏,可以讓你做這樣

@morph(self.someView.frame, _.origin.x += 10); 

或者,如果你想改變xwidth

@morph(view.frame, { 
    _.origin.x += 10; 
    _.size.width -= 10; 
}); 
相關問題