2014-01-10 41 views
1

我有以下問題:我想要有常量,在parentView.subviews數組中定義子視圖的順序。這個常量不一定是子視圖數組的索引,但它們可以。zPosition和子視圖數組

事情是這樣的:

#define VIEW1_INDEX 10 // or 0, if it's an index 
#define VIEW2_INDEX 20 // or 1, if it's an index 

而這將意味着,這parentView.subviews陣列{view1, view2}


首先我試着使用CALayer的zPosition屬性。

假設我有parentView的兩個子視圖:view1view2,它們具有相同的大小和框架。 parentView.subviews數組是{view1, view2}(按此順序)。 如果我做

view2.layer.zPosition = VIEW2_INDEX; 
view1.layer.zPosition = VIEW1_INDEX; 

比子視圖改變顯示順序,但自來水處理次序和parentView.subviews陣列保持不變,所以我看到view1頂部,點擊就可以了,但是這頭通過view2,處理這不是我所期望的。

所以我需要同時更改顯示順序和事件處理順序。

我的最好的辦法是使用代碼,與代碼送花兒給人一起確立了新的z位置,改變子視圖數組:

view2.layer.zPosition = 0; 
NSUInteger* index = [parentView.subviews indexOfObject:view2]; 
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index]; 

但這並不似乎是最好的解決辦法。


其他的想法是用[parentView insertSubview:atIndex:]代替[parentView addSubview],但比我需要確保我將在適當的順序,這是一個小討厭,因爲我在被創造了約15次的意見不同的地方。


因此,這裏是最後的問題:有沒有辦法解決問題,在開始描述?

回答

1

根據所需的堆疊順序,如何分配子視圖的標籤1..15(如果有15個)。將它們全部放在一個數組中,然後按標籤排序。迭代數組,將它們添加到超級視圖。

我不知道他們是如何創建的,但讓我們說,他們被包含在一些陣列中以任意順序:

NSMutableArray *views = [NSMutableArray array]; 

UIView *subview9 = [[UIView alloc] init]; 
subview9.tag = 9; 
[views addObject:subview9]; 

// and so on, in arbitrary order for subview1, subview2, subview3 
// remember tag == 0 is no good, because it will be undistinguishable in viewWithTag 
// from unassigned tags 

數組排序:

[views sortUsingComparator:^(UIView *vA, UIView *vB) { 
    return vA.tag - vB.tag; 
}]; 

將它們添加到上海華盈,現在分類:

for (UIView *view in views) { 
    [theViewThatContainsThemInTagOrder addSubview:view]; 
} 
1

如果使用z位置將只是移動層(視覺部分),但每事情會像沒有任何變化一樣工作。通過使用這種嘗試:

[self.view sendSubviewToBack:view1]; 

[self.view bringSubviewToFront:view2];