2011-07-16 74 views
0

我在一個主視圖內有幾個視圖。這些觀點都是互相背後的,所以目前只能看到最高的一個。我想要做的是,根據某些特定的用戶輸入,屏幕背面的其中一個視圖會向下移動,因此可以在俯視圖下方看到它。我一直在試圖通過確定兩個視圖是否正在重疊,如果它們仍然重疊,降低它,等等,直到它們不再重疊並且都是完全可見,那麼它們會重疊。然後,我想要調整主視圖的大小,以便可以看到兩個視圖,但我認爲這只是使用setBounds或setFrame,還沒有得到。可可移動重疊NSViews

對於第一個問題,我還沒有找到一種方法來從字面上看兩個視圖是否重疊,如果不能完成,我想也許通過在視圖邊界上繪製矩形並檢查它們是否重疊,但是我不'不知道我能做些什麼。我認爲邊界或框架是必要的,但我不確定這些是如何不同的。

基本上,我想檢查兩個NSView是否重疊,如果他們這樣做,我想降低其中一個。

編輯:這部分問題已經解決了,但現在出現了一個新問題。我有三種觀點,一種主觀觀點和兩種子觀點。主視圖沒有任何內容,它只包含幾個子視圖,主視圖內的任何內容都是應該看到的內容。這兩個子視圖堆疊在主視圖頂部,因此最前面的一個是可見的,後面的一個隱藏。當用戶點擊開始時,後面的視圖變得可見,我用一個選擇器設置一個重複計時器,該選擇器將檢查視圖是否重疊,如@Vince所說,如果他們這樣做,它會稍微偏移後面的一個,再次檢查,直到它們不再重疊。使用這個:

- (void)updateViews { 
CGRect viewFrame = [view frame]; //view is the frontmost view that will not move 
CGRect backroundViewFrame = [backgroundView frame]; //the view in the back 

CGRect rectIntersection = CGRectIntersection (viewFrame, 
               backgroundFrame); 

//if the intersect is NOT null, it'll offset down by 2 
if (!CGRectIsNull(rectIntersection)) { 
    CGRect newFrame = CGRectOffset (
            rectIntersection, 
            0,  //doesn't move in x 
            -2  //lowers by 2 in y 
            ); 
    [backgroundView setFrame:newFrame]; //lowers the view to the new offset rect 

} else{ 
    [viewsUpdater invalidate]; //stops the timer when rects no longer intersect 
    viewsUpdater = nil; 
} 

問題是,當我降低backgroundView,它只在它與前視圖相交的空間中可見。即使我將主視圖展開得更低(這是主意,它們都將以相同的尺寸開頭,當backgroundView降低時,主視圖將調整並顯示兩者)。但現在無論主視圖的大小如何,backgroundView只在與前視圖相交的區域纔可見。我認爲它正在走向它所需要的地方,但是到了它停止的時候它完全不可見,所以我不能說。

感謝您的幫助。

+0

對不起,也許起初,更新誤解的問題! – 2011-07-16 08:57:09

回答

4

基本上,你就能知道是否有兩個NSView對象重疊通過得到兩個frame屬性(CGRectIntersection()),然後測試的結果的交叉使用CGRectIsNull()爲空。
這是它的doc

現在,關於把一個視圖在另一個,這聽起來像你需要使用這種方法從NSView-(void)setSubviews:(NSArray *)newSubviews;,其中根據documentation,讓你重新排序的子視圖。

或者僅僅使用-(void)replaceSubview:(NSView *)oldView with:(NSView *)newView;即表示,由於oldView將被釋放,因此請小心保留之前的引用。

如果你只是試圖移動視圖下,你只需要改變reciever的框架origin,例如:

CGRect actualFrame = [aView frame]; 
CGPoint framesOrigin = actualFrame.origin; 
CGRect newFrame = CGRectMake(framesOrigin.x, 
          (framesOrigin.y)+50, 
          actualFrame.width, 
          actualFrame.height); 
[aView setFrame:newFrame]; 

這將移動aView下,通過改變其邊框的y座標起源。

最後,關於SO Difference between view's frame and view's bound + iPhoneboundsframe性質,這個帖子的區別,應該回答你的問題;)

+0

這真的幫了很大忙。雖然我用CGRectOffset而不是CGRectMake。非常感謝你! – Elbimio

+0

歡迎您,如果我的答案符合您的需求,請點擊左邊的chekmark;) – 2011-07-17 09:49:41

+0

我打算。我還沒有做到這一點,以便其他人可能仍然在尋找回答編輯中的部分。如果他們看到已經回答了,他們可能會忽略這個問題。 – Elbimio