如何设置iPhone UIView z索引?

我想移动另一个视图,我怎么能知道视图的z索引,以及如何移动到顶部?

UIView兄弟姐妹是按顺序叠加到他们的超级视图。 UIView层次结构的方法和属性可以pipe理视图的顺序。 在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数组中sorting的。 所以最重要的观点是:

 [parentView.subviews lastObject]; 

底部视图将是:

 [parentView.subviews objectAtIndex:0]; 

就像Kolin Krewinkel所说的那样, [parentView bringSubviewToFront:view]会将视图置于顶层,但是如果视图是层次结构中的所有兄弟,则只有这种情况。

您可以使用视图图层的zPosition属性(它是一个CALayer对象)来更改视图的z-index。

 theView.layer.zPosition = 1; 

正如Viktor Nordling所说,“大的价值是最重要的,你可以使用任何你想要的价值,包括负值。” 默认值是0。

您需要导入QuartzCore框架来访问图层。 只需在实现文件的顶部添加这行代码即可。

 #import "QuartzCore/QuartzCore.h" 
 [parentView bringSubviewToFront:view] ; 

IB和Swift

鉴于黄色是超级观点的stream动布局,红色,绿色和蓝色是黄色的同胞子视图,

在这里输入图像说明

目标是将子视图(让我们说绿色)移到顶部。

在这里输入图像说明

在界面生成器

在界面生成器中,只需将要显示在顶部的视图拖动到“文档大纲”中列表的底部即可。

在这里输入图像说明

或者,您可以select视图,然后在菜单中转到编辑器>排列>发送到前面

在Swift中

有几种不同的方式来编程。

方法1

 yellowView.bringSubviewToFront(greenView) 
  • 这种方法是上面IB回答的编程方式。
  • 它只适用于子视图是彼此的兄弟姐妹。
  • 子视图的数组包含在yellowView.subviews 。 在这里, bringSubviewToFrontgreenView从索引0移动到2 。 这可以用来观察

     print(yellowView.subviews.indexOf(greenView)) 

方法2

 greenView.layer.zPosition = 1 
  • 该方法只是在z轴上移动较高层(更靠近用户)的3D位置。 由于所有其他视图的默认值为0 ,因此结果是greenView看起来像是在顶部。 但是,它仍然保留在yellowView.subviews数组的索引0处。 但是,这可能会导致一些意想不到的结果,因为像tap事件这样的事件仍然会先到索引号最高的视图。 出于这个原因,采用上面的方法1可能会更好。
  • zPosition可以设置为CGFloat(FLT_MAX)以确保它在最前面。

如果你想通过XCode的界面生成器来做到这一点,你可以使用Editor-> Arrangement下的菜单选项。 你会发现“发送到前面”,“发送到后面”等

在你想要达到顶峰的视野里(迅速)

 superview?.bringSubviewToFront(self) 

如果你正在使用cocos2d,你可能会看到[parentView bringSubviewToFront:view]的问题,至less它不适合我。 我没有把我想要的观点带到前面,而是把其他观点发回去,这就是诀窍。

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

我喜欢在故事板UI界面中调整UI。 我使用tag来指示这些视图的z-Index

在迅速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) }