Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在子视图下添加图层_Ios_Swift_Uiview_Avplayer_Avplayerlayer - Fatal编程技术网

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