我想将一个视图移到另一个视图之上,我怎么知道视图的z索引,以及如何移动到顶部?
如果你使用cocos2d,你可能会看到[parentView bringSubviewToFront:view]的问题,至少它不适合我 . 我没有将我想要的视图带到前面,而是将其他视图发回去,这就是诀窍 .
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
我们可以在ios中使用zPosition
如果我们有一个名为 salonDetailView 的视图,例如: @IBOutlet weak var salonDetailView: UIView!
@IBOutlet weak var salonDetailView: UIView!
In my case see the image
和 GMSMapView 有UIView例如: @IBOutlet weak var mapViewUI: GMSMapView!
@IBOutlet weak var mapViewUI: GMSMapView!
要显示mapViewUI的View salonDetailView上部
use zPosition as below
salonDetailView.layer.zPosition = 1
UIView 兄弟姐妹按照添加到超级视图的顺序堆叠 . UIView 层次结构方法和属性用于管理视图顺序 . 在UIView.h中:
UIView
@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 数组中返回到前面 . 所以最顶层的视图将是:
subviews
[parentView.subviews lastObject];
和底部视图将是:
[parentView.subviews objectAtIndex:0];
就像Kolin Krewinkel所说的那样, [parentView bringSubviewToFront:view] 会将视图置于顶端,但只有视图是层次结构中的所有兄弟姐妹才会出现这种情况 .
[parentView bringSubviewToFront:view]
您可以使用视图's layer (it' s CALayer 对象的 zPosition 属性来更改视图的z-index .
CALayer
zPosition
theView.layer.zPosition = 1;
当Viktor Nordling添加时,"big values are on top. You can use any values you want, including negative values."默认值为0 .
您需要导入QuartzCore框架才能访问该层 . 只需在实现文件的顶部添加此行代码即可 .
#import "QuartzCore/QuartzCore.h"
IB and Swift
鉴于流动的布局,黄色是超视图,红色,绿色和蓝色是兄弟的黄色子视图,
目标是将子视图(让我们说绿色)移到顶部 .
在Interface Builder中,您需要做的就是将您想要显示的视图拖到文档大纲中列表的底部 .
或者,您可以选择视图,然后在菜单中转到编辑器>排列>发送到前面 .
有几种不同的方法可以以编程方式执行此操作 .
Method 1
yellowView.bringSubviewToFront(greenView)
此方法是上述IB答案的程序化等效方法 .
仅当子视图是彼此的兄弟姐妹时才有效 .
子视图的数组包含在 yellowView.subviews 中 . 这里, bringSubviewToFront 将 greenView 从索引 0 移动到 2 . 这可以用来观察
yellowView.subviews
bringSubviewToFront
greenView
0
2
print(yellowView.subviews.indexOf(greenView))
Method 2
greenView.layer.zPosition = 1
此方法只是在z轴上将图层的3D位置移动得更高(更靠近用户) . 由于所有其他视图的默认值为 0 ,因此结果是 greenView 看起来像在顶部 . 但是,它仍然保留在 yellowView.subviews 数组的索引 0 处 . 但是,这可能会导致一些意想不到的结果,因为点击事件之类的内容仍将首先进入索引编号最高的视图 . 出于这个原因,最好采用上面的方法1 .
zPosition 可以设置为 CGFloat.greatestFiniteMagnitude (旧版Swift中的 CGFloat(FLT_MAX) )以确保它位于顶部 .
CGFloat.greatestFiniteMagnitude
CGFloat(FLT_MAX)
[parentView bringSubviewToFront:view] ;
如果要通过XCode的Interface Builder执行此操作,可以使用Editor-> Arrangement下的菜单选项 . 在那里你会找到“发送到前面”,“发送到后面”等 .
在视图中你想要带到顶部......(在swift中)
superview?.bringSubviewToFront(self)
8 回答
如果你使用cocos2d,你可能会看到[parentView bringSubviewToFront:view]的问题,至少它不适合我 . 我没有将我想要的视图带到前面,而是将其他视图发回去,这就是诀窍 .
我们可以在ios中使用zPosition
如果我们有一个名为 salonDetailView 的视图,例如:
@IBOutlet weak var salonDetailView: UIView!
In my case see the image
和 GMSMapView 有UIView例如:
@IBOutlet weak var mapViewUI: GMSMapView!
要显示mapViewUI的View salonDetailView上部
use zPosition as below
UIView
兄弟姐妹按照添加到超级视图的顺序堆叠 .UIView
层次结构方法和属性用于管理视图顺序 . 在UIView.h中:兄弟视图在
subviews
数组中返回到前面 . 所以最顶层的视图将是:和底部视图将是:
就像Kolin Krewinkel所说的那样,
[parentView bringSubviewToFront:view]
会将视图置于顶端,但只有视图是层次结构中的所有兄弟姐妹才会出现这种情况 .您可以使用视图's layer (it' s
CALayer
对象的zPosition
属性来更改视图的z-index .当Viktor Nordling添加时,"big values are on top. You can use any values you want, including negative values."默认值为0 .
您需要导入QuartzCore框架才能访问该层 . 只需在实现文件的顶部添加此行代码即可 .
IB and Swift
鉴于流动的布局,黄色是超视图,红色,绿色和蓝色是兄弟的黄色子视图,
目标是将子视图(让我们说绿色)移到顶部 .
在Interface Builder中
在Interface Builder中,您需要做的就是将您想要显示的视图拖到文档大纲中列表的底部 .
或者,您可以选择视图,然后在菜单中转到编辑器>排列>发送到前面 .
在斯威夫特
有几种不同的方法可以以编程方式执行此操作 .
Method 1
此方法是上述IB答案的程序化等效方法 .
仅当子视图是彼此的兄弟姐妹时才有效 .
子视图的数组包含在
yellowView.subviews
中 . 这里,bringSubviewToFront
将greenView
从索引0
移动到2
. 这可以用来观察Method 2
此方法只是在z轴上将图层的3D位置移动得更高(更靠近用户) . 由于所有其他视图的默认值为
0
,因此结果是greenView
看起来像在顶部 . 但是,它仍然保留在yellowView.subviews
数组的索引0
处 . 但是,这可能会导致一些意想不到的结果,因为点击事件之类的内容仍将首先进入索引编号最高的视图 . 出于这个原因,最好采用上面的方法1 .zPosition
可以设置为CGFloat.greatestFiniteMagnitude
(旧版Swift中的CGFloat(FLT_MAX)
)以确保它位于顶部 .如果要通过XCode的Interface Builder执行此操作,可以使用Editor-> Arrangement下的菜单选项 . 在那里你会找到“发送到前面”,“发送到后面”等 .
在视图中你想要带到顶部......(在swift中)