2010-04-05 49 views
2

我有一個NSMutableArray的保存UIViewControllers集合重新排序基於其CGPoint的UIView的集合

在其他的屬性和方法,每個viewControllers的實例被放置在一個父視圖

用戶將在需要時單獨放置這些對象。

所以基本上我使用 - (void)addSubview:(UIView *)視圖添加到父視圖控制器的新視圖。

因爲UI是等距它使事情稍微更復雜

我所試圖做的是重新排序基於其座標位置的看法,所以項目越往上父UIView的幀索引低於父UIview框架中較低的視圖。並且位於視圖左側的項目位於比右側更高的索引處

我認爲解決方案可能與重新排序NSMutableArray有關,但我如何才能比較CGpoints?我是否需要分別比較x和y?

回答

0

我已經設法解決這個問題,我做了鍵值一些閱讀編碼

我創建了一個名爲itemY存儲view.frame.origin.y值屬性。

我創建了一個方法來重新分配itemY與當前view.frame.origin.y值。

查閱存儲ViewControllers的陣列的視圖控制器使用一個實例NSSortDescriptor與屬性itemY。

一個新的NSArray使用NSSortDescriptor

現在我遍歷新NSArray的創建和執行我的邏輯

0

那麼用戶可以在父視圖內拖動視圖?當一個視圖改變位置時,你想改變它在子視圖中的位置索引,以便繪製順序是正確的?

您可以使用-(void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2做到這一點。僅僅在數組中重新排序它們是不夠的,因爲父UIView有自己的數組來跟蹤視圖。您應該創建一個重新排序方法,您可以在自己的數組和父視圖中切換視圖。

有一些函數用於檢查點的等式,包括點在rects,rects等交集,但在這裏它聽起來像你想得到origin.y點,並用它來比較哪些視圖進一步「返回「或到前...

另外,你可能想看看使用CALayers,它也支持設置az位置。

+0

是用戶可以拖動的意見,因爲他們的願望,它已經安裝程序檢測到其他意見,使他們不要重疊等,我已經差不多完成了這個課程,這是實際的索引順序,給了我一點悲傷。我會看看CALayers類,看看是否有幫助。 另外,如果你也許可以回答這個問題,exchangeSubviewAtIndex看來可能有用,但視圖控制器視圖動態添加,我看不到屬性爲視圖的索引值,我手動跟蹤這個?歡呼聲 – Chris 2010-04-05 18:04:32

+0

exchangeSubview ...在UIView上定義。沒有辦法,因爲據我所知,得到一個視圖索引的,但你也許可以使用標籤和viewWithTag:保持與自己的陣列同步的視圖排序。但是,再次,圖層可能對您更好,並且如果您想要創建動畫和效果,將會爲您提供更好的性能和更大的靈活性。 – Felixyz 2010-04-05 18:39:49

+0

謝謝,我只是讀了這個 - 我正在思考類似的問題,我已經管理了一個涉及獲取標籤並重新排序的解決方案。還有我沒有在我的問題提信息的一個關鍵部分,但我還是會考慮CALayers,如果它有可能與性能方面提供幫助,因爲我認爲這可能是我做過的方式有點重。乾杯! – Chris 2010-04-09 23:44:01

0

這可能是一個簡單的答案,但也許這就是你要找的。

假設你有機會獲得他們的CGpoints,你可以寫一個...

- (NSComparisonResult)比較:(NSObject的*)進入;

方法在每個委託中查看傳入和「自我」的CG點並返回一個NSComparisonResult。很酷的事情是,你可以運行...

[myMutableArray sortUsingSelector:@selector(compare :)];

任何時間任何變化。你只需要設置compare:方法來返回正確的NSComparisonResult。

+0

感謝你們,我必須閱讀NSComparisonResult,這似乎很有用 – Chris 2010-04-09 23:45:28