如何设置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
。 在这里,bringSubviewToFront
将greenView
从索引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) }