2011-01-08 51 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) 
}