2011-01-08 55 views

回答

259

UIView兄弟姐妹被堆疊在它們被添加到其上海華的順序。該UIView層次的方法和屬性是有管理的視角次序。在UIView.h:

@property(nonatomic,readonly) UIView *superview; 
@property(nonatomic,readonly,copy) NSArray *subviews; 

- (void)removeFromSuperview; 
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; 
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2; 

- (void)addSubview:(UIView *)view; 
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; 
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview; 

- (void)bringSubviewToFront:(UIView *)view; 
- (void)sendSubviewToBack:(UIView *)view; 

同級視圖排序回到subviews陣列在前面。所以,最上面的觀點是:

[parentView.subviews lastObject]; 

和底部的觀點是:

[parentView.subviews objectAtIndex:0]; 

像歌林Krewinkel說,[parentView bringSubviewToFront:view]將帶來視圖頂部,但這隻有在意見的情況都是層次結構中的所有兄弟姐妹。

287

您可以使用視圖圖層的zPosition屬性(它是一個CALayer對象)來更改視圖的z索引。

theView.layer.zPosition = 1; 

由於Viktor Nordling補充說,「大的值是在上面。你可以使用任何你想要的價值,包括負值。」默認值爲0。

您需要導入QuartzCore框架訪問層。只需將這行代碼添加到實現文件的頂部即可。

#import "QuartzCore/QuartzCore.h" 
+6

正如一個幫手,大值是 「上面」。你可以使用任何你想要的值,包括負值。 – 2012-06-09 13:08:43

+11

如果您希望您的視圖始終處於最佳狀態,則此解決方案更好。 只需將zPosition設置爲MAXFLOAT – 2012-11-22 17:42:10

69
[parentView bringSubviewToFront:view] ; 
15

如果你想通過Xcode的界面生成器要做到這一點,你可以用下編輯 - >排列的菜單選項。你會發現「Send to Front」,「Send to Back」等等。

4

如果你使用的是cocos2d,你可能會發現[parentView bringSubviewToFront:view]有問題,至少它不適合我。我沒有把我想要的觀點帶到前面,而是把其他觀點發回來,並且做到了這一點。

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 
57

IB和斯威夫特

鑑於流動佈局,其中黃色的是上海華和紅,綠,藍是兄弟的黃子視圖,

views - red view on top

的目標是將子視圖(讓我們說綠色)移動到頂部。

views - green view on top

在Interface Builder

在Interface Builder中所有你需要做的是拖動要顯示在頂部在文檔大綱列表底部的視圖。

order of views in Interface Builder

或者,您也可以選擇視圖,然後在菜單中去編輯>排列>發送到前

在斯威夫特

有幾種不同的方法以編程方式做到這一點。

方法1

yellowView.bringSubviewToFront(greenView) 
  • 此方法是上述的IB答案的方案等效。
  • 它只適用於子視圖是彼此的兄弟姐妹。
  • 子視圖的數組包含在yellowView.subviews中。這裏,bringSubviewToFrontgreenView從索引0移動到2。這可以用

    print(yellowView.subviews.indexOf(greenView)) 
    

方法2

greenView.layer.zPosition = 1 
  • 此方法只是移動層的3D位置可以觀察到更高的z軸(更靠近用戶) 。由於所有其他視圖的默認值爲0,因此結果爲greenView看起來好像在頂部。但是,它仍然位於yellowView.subviews陣列的索引0處。但是,這可能會導致一些意想不到的結果,因爲像tap事件這樣的事件仍將首先進入索引號最高的視圖。出於這個原因,使用上面的方法1可能會更好。
  • zPosition可以設置爲CGFloat.greatestFiniteMagnitudeCGFloat(FLT_MAX)在老版本的Swift中)以確保它在最前面。
5

在你想帶頂端的觀點... (斯威夫特)

superview?.bringSubviewToFront(self) 
0

我想調整故事板UI界面UI。我用tag來表示那些視圖的z-Index

在SWIFT 3

// Connect to those views, who need to adjust their z position. 
@IBOutlet var viewSetZIndex: [UIView]! 

// In `viewDidLoad`, or `awakeFromNib` 
for v in viewSetZIndex { 
    // Use `tag` to adjust `zPosition` 
    v.layer.zPosition = CGFloat(v.tag) 
}