我在一個主視圖內有幾個視圖。這些觀點都是互相背後的,所以目前只能看到最高的一個。我想要做的是,根據某些特定的用戶輸入,屏幕背面的其中一個視圖會向下移動,因此可以在俯視圖下方看到它。我一直在試圖通過確定兩個視圖是否正在重疊,如果它們仍然重疊,降低它,等等,直到它們不再重疊並且都是完全可見,那麼它們會重疊。然後,我想要調整主視圖的大小,以便可以看到兩個視圖,但我認爲這只是使用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只在與前視圖相交的區域纔可見。我認爲它正在走向它所需要的地方,但是到了它停止的時候它完全不可見,所以我不能說。
感謝您的幫助。
對不起,也許起初,更新誤解的問題! – 2011-07-16 08:57:09