2013-08-22 109 views
0

我只是好奇你爲什麼不能訪問view.center.x或view.center.y,但你可以訪問view.center並進行更改。爲什麼不能訪問view.center.x/y

我想寫這樣的代碼:

imgView_.center = scrollView_.center; 
if (imgView_.frame.origin.x < 0) 
    imgView_.center = CGPointMake(imgView_.center.x + (imgView_.frame.size.width - self.view.frame.size.width)/2, imgView_.center.y); 
if (imgView_.frame.origin.y < 0) 
    imgView_.center = CGPointMake(imgView_.center.x, imgView_.center.y + (imgView_.frame.size.height - self.view.frame.size.height)/2); 

由於:

imgView_.center = scrollView_.center; 
if (imgView_.frame.origin.x < 0) 
    imgView_.center.x = imgView_.center.x + (imgView_.frame.size.width - self.view.frame.size.width)/2; 
if (imgView_.frame.origin.y < 0) 
    imgView_.center.y = imgView_.center.y + (imgView_.frame.size.height - self.view.frame.size.height)/2; 

我找不到第二個方式很多更優雅,但我不能訪問x和y,所以我我想問問,如果有人知道蘋果阻止它的原因是什麼。

+1

這可能有所幫助:http://stackoverflow.com/a/2983979/653513 –

+0

或甚至更好:http://stackoverflow.com/a/2983939/653513 –

回答

3

UIView'sUIViewGeometry類定義中心物業如下

@property(nonatomic) CGPoint center; 

通過中心物業的聲明,我們有吸氣&二傳手方法中心物業。它意味着我們有setter &結構的getter方法不是結構內的值。 和Center是CGPoint結構變量,其具有兩個CGFloatx和y

這就是我們無法直接設置中心屬性中的x和y值。它與Frame屬性相似。

+0

WHYYYYYYYY?^_^ –

+0

@LordZsolt除了c和objective-c的混合之外,其中一個主要原因是有更新中心屬性時需要更新的計算屬性(例如框架)。直接更改結構成員將跳過此更新 – wattson12

+0

我同意@wattson,有一些相關的屬性,需要更新自動更新中心和框架等屬性,爲什麼蘋果沒有給任何鏈接設置座標(X和Y )直接。特別是你可以在座標相關的財產情況下看到這一點。 – Suryakant

2

UIView屬性center是一個CGPoint它是struct類型,而不是一個ObjectiveC類。

即使寫這篇

view.center.x = view.center.x +10; 

類似於

CGPoint center = view.center; 
center.x = center.x +10; 
view.center = center; 

他們是不同的東西。

根據編譯器view.center是方法調用[view center]center.x正在訪問struct CGPoint的公共ivar。如果你寫了這一切在單行

view.center.x = view.center.x +10; 

編譯器是無法解決此並拋出一個錯誤Expression is not assignable。原因是view.center.x進一步解析爲函數調用,

objc_msgSend(view, @selector(center)) 

現在你正試圖修改C函數的返回值如下

objc_msgSend(view, @selector(center)).x = 20 //(Some value on RHS) 

這是沒有意義的函數返回值」不是個存儲在任何地方,因此得到的表達式是不可分配的。

欲瞭解更多信息,請閱讀this answer

希望有幫助!

2

在片段imgView_.center.x.center屬性訪問而.x字段訪問。該物業的類型爲CGPoint,這是一種通過傳遞的結構類型。

如果您有類型的變量CGPoint您可以直接分配給各個領域,如:

CGPoint myPoint; 
myPoint.x = 3; 

但是傳遞CGPoint值函數或方法時,你無法通過只是它的一個領域 - 它沒有意義。例如。如果你有以下功能:

void doSomething(CGPoint aPoint); 

你可以通過myPoint

doSomething(myPoint); 

,但也沒有辦法說「剛剛通過x場」 - 什麼會,即使是什麼意思?函數期望CGPoint,通過它的座標是什麼意思?

當您將片段imgView_.center放在作業的左側時,您只是使用縮寫來調用方法。例如: -

imgView_.center = myPoint; <=> [imgView_ setCenter:myPoint]; 

,只是像上面的函數是沒有辦法說「剛剛通過x場」。

重點是屬性訪問不是一個變量訪問,即使它通常被認爲是一個,但函數/方法調用;所以你不能分配給結構類型屬性的單個字段。

在右側訪問屬性的字段很好。例如。在RHS imgView_.center轉化爲[imgView_ center] - 它返回一個CGPoint,您可以訪問結構價值的領域,所以在RHS imgView_.center.x轉化爲[imgView_ center].x,一切都OK。但是請注意,在均爲個案(setCenter:center方法)中,這些方法本身採取/返回完整CGPoint

HTH。

相關問題