Ios 在子视图下添加图层
我试图在先前加载的子视图下面添加函数Ios 在子视图下添加图层,ios,swift,uiview,avplayer,avplayerlayer,Ios,Swift,Uiview,Avplayer,Avplayerlayer,我试图在先前加载的子视图下面添加函数setupPlayerView的子层。子视图的加载速度比层快,因为创建层的函数使用的字符串是从另一个类修改而来的,UIViewController(我想加载单个视频)。我在stackoverflow上找到了答案,但是.insertSublayer(player,下面是:self.controlsContainerView.layer)的建议解决方案对我不起作用。如何确保videolayer依次位于所有其他子视图(如controlsContainerView)及
setupPlayerView
的子层。子视图的加载速度比层快,因为创建层的函数使用的字符串是从另一个类修改而来的,UIViewController
(我想加载单个视频)。我在stackoverflow上找到了答案,但是.insertSublayer(player,下面是:self.controlsContainerView.layer)
的建议解决方案对我不起作用。如何确保videolayer依次位于所有其他子视图(如controlsContainerView
)及其子视图(如activityIndicatorView
)下
下面是我现在得到的:
class PlayerView: UIView {
var urlString: String? {
didSet {
setupPlayerView()
}
}
override init(frame: CGRect){
super.init(frame: frame)
//although the function is called immediately it is not the "lower" than everything else
setupPlayerView()
//add subview with controls (e.g. spinner)
controlsContainerView.frame = frame
addSubview(controlsContainerView)
//add to subview and center spinner in subview
controlsContainerView.addSubview(activityIndicatorView) // (spinner)
controlsContainerView.addSubview(whiteView)
//...
}
//... irrelevant code (closures like `activityIndicatorView` and `whiteView`)
//setup video player
func setupPlayerView() {
if let urlString = self.urlString, let videoURL = NSURL(string: urlString){
print(urlString)
//player's video
if self.player == nil {
player = AVPlayer(url: videoURL as URL)
}
//add sub-layer
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.frame
self.controlsContainerView.layer.insertSublayer(playerLayer, below: self.controlsContainerView.layer)
//when are frames actually rendered (when is video loaded so one can remove spinner)
player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
}
}
对于那些感兴趣的人:我在另一个类(ViewController)中以以下方式更改urlString
:
尝试将其插入索引0,而不是相对于另一个视图。插入子层或添加子视图会导致视图堆栈顶部的添加。尝试在索引0处插入,或者尝试在下面放置新索引的层的索引处插入。效果很好!非常感谢。
videoPlayerView.urlString = videoUrl //videoUrl being some link to a video source