2011-11-24 31 views
0

我想做一個NSView的簡單動畫。該視圖有一些怪異的「跳躍」的問題,我設法把衣服脫我的代碼爲什麼當我將其框架設置爲其現有邊界時,我的視圖會移動?

[editView setFrame:NSMakeRect([editView bounds].origin.x, 
    [editView bounds].origin.y, 
    [editView bounds].size.width, 
    [editView bounds].size.height)]; 

,它仍然生產的「jummping」的問題。當我運行它時,我希望視圖根本不會移動,但是在第一次也是僅第一次時,它會跳到左邊約200px。什麼可能會出錯?

回答

2

框架和邊界不是一回事。一個觀點的框架是它的超級觀點座標系統中的位置和大小,而它的界限是它自己的座標系統的起源和大小。

默認情況下,視圖邊界的原點爲0,0。這與其幀的位置無關。因此,當您將視圖的框架(例如200,0(在其父座標系中)更改爲0,0時,將其向左移動200點*。

如果您將視圖的框架設置爲其框架,則視圖將不會像您期望的那樣移動。

(順便說一句:boundsframe都是NSRects,所以沒有理由說NSMakeRect用矩形的個人會員,如果你只是要通過他們都通過不變)

*不像素。觀點座標以點爲單位,一個虛構的單位來自PostScript點(1/72英寸);你不能也不應該依賴於等於像素的點。

+0

謝謝,改變邊界,以幀使其正常工作。我想我應該早些時候捕獲這個,當它返回0.00000作爲X和Y座標(我認爲0.000是來自其他問題) – nosedive25

1

邊界用視圖的局部座標系表示。框架在超視圖的座標空間中表示。

0

它看起來像你越來越混淆術語框架和界限。

當你運行該代碼時,你的邊界源的值是什麼?很可能{0,0}(在調試器中檢查它),因爲請記住,邊界處理視圖自己的內部座標,而幀處理超視圖的座標。

如果您的邊界原點是{0,0},那麼當您運行代碼時,將幀原點設置爲{0,0},也稱爲超視圖的左上角。你的界限來源仍然沒有改變。因此,下次運行它時,它會將幀起始位置設置爲{0,0},這就是原來的位置,所以不會發生移動。

如果您將所有邊界呼叫更改爲幀,則會得到您想要的原始結果,即使在第一次呼叫時也不會移動。

我建議學習更多關於座標系的知識。這裏有一些地方開始:

UIView Programming Guide Previous Answer on StackOverflow

+1

一個注意:這個問題是關於Cocoa> NSView,而不是Cocoa Touch> UIView。 – 2011-11-24 02:15:02

+0

啊,是的,對不起,錯過了。儘管同樣的原則適用。 – sosborn

+0

是的,但你應該用NSView替換UIView並改變座標系。 – 2011-11-24 02:18:34

相關問題