iOS Swift:如何在视频显示子视图上方添加UI元素?
这问题我碰到过好多次啦,核心就是**视图层级(z-index)**的锅!你在Storyboard里加的全名、头像、时间这些元素,本来是放在黑色视频容器View上的,但播放视频时你通过代码添加的视频子视图,默认会被加到容器View子视图列表的最后——也就是层级最上层,自然就把Storyboard里的元素给盖住了。
给你几个靠谱的解决办法,挑适合你的用:
调整视频视图的插入位置:
别直接用addSubview(videoView)添加视频子视图,而是改成把它插到容器View子视图的最底层:// videoParentView就是你Storyboard里的黑色视频容器View videoParentView.insertSubview(videoView, at: 0)或者更精准一点,指定插到某个信息元素的下面:
// nameLabel是你Storyboard里的全名标签 videoParentView.insertSubview(videoView, belowSubview: nameLabel)手动把信息元素调到最上层:
如果已经添加了视频视图,也可以直接把需要显示的元素层级拉高:// 单个元素调整 nameLabel.superview?.bringSubviewToFront(nameLabel) avatarImageView.superview?.bringSubviewToFront(avatarImageView) timeLabel.superview?.bringSubviewToFront(timeLabel)要是这些信息元素都放在一个单独的容器View里(比如叫infoContainerView),那就更方便了,直接把这个容器View调到最上层就行:
infoContainerView.superview?.bringSubviewToFront(infoContainerView)检查Storyboard的层级列表:
打开Storyboard左侧的Document Outline(层级列表),确认你的全名、头像这些元素确实是黑色视频容器View的子视图,而且没有被意外拖到容器View的下面(也就是层级比容器View还低)。AVPlayerLayer的特殊处理:
如果你是直接把AVPlayerLayer加到容器View的layer上,建议先创建一个UIView来承载这个layer,再把承载View按上面的方法插到底层,这样层级管理更灵活:let player = AVPlayer(url: yourVideoURL) let playerLayer = AVPlayerLayer(player: player) let videoHostView = UIView(frame: videoParentView.bounds) videoHostView.layer.addSublayer(playerLayer) playerLayer.frame = videoHostView.bounds // 插到容器View最底层 videoParentView.insertSubview(videoHostView, at: 0)
本质上就是确保你的信息元素的层级比视频视图高,不管用哪种方法都能解决这个遮挡问题~
内容的提问来源于stack exchange,提问作者user1591668

