swift – AVPlayerAVPlayerLayer没有出现在使用自动布局的子视图中

swift – AVPlayerAVPlayerLayer没有出现在使用自动布局的子视图中,第1张

概述我正在尝试在包含视频和一些文本的子视图中显示视频.我使用 recommended UIView subclass from Apple来创建一个UIView来包含我的AVPlayer: import Foundationimport AVFoundationclass JSAVPlayerView : UIView { var player:AVPlayer? { g 我正在尝试在包含视频和一些文本的子视图中显示视频.我使用 recommended UIView subclass from Apple来创建一个UIVIEw来包含我的AVPlayer:

import Foundationimport AVFoundationclass JsAVPlayerVIEw : UIVIEw {    var player:AVPlayer? {        get {            return (self.layer as! AVPlayerLayer).player        }        set(newPlayer) {            (self.layer as! AVPlayerLayer).player = newPlayer        }    }    overrIDe class func layerClass() -> AnyClass {        return AVPlayerLayer.self    }}

我使用JsAVPlayerVIEw作为UICollectionVIEwCell中的子视图,如下所示,但我只看到了JsAVPlayerVIEw的背景.

class JsOnBoardingTutorialPageVIEw : UICollectionVIEwCell {    // MARK: member variables    private var tutorialVIDeoPlayer:AVPlayer!    private var vIDeoPlayerVIEw:JsAVPlayerVIEw = JsAVPlayerVIEw()    private var tutorialLabel:UILabel = UILabel()    var tutorialText:String = "" {        dIDSet {            tutorialLabel.text = tutorialText        }    }    // MARK: auto layout variables    private var metrics:[String:CGfloat] = [        "margintop" : 30,"marginleft" : 30,"marginRight" : 30,"marginBottom" : 30,"textHeight" : 100,]    private var autolayoutConstraints:[NSLayoutConstraint] = [NSLayoutConstraint]()    // MARK: constructors    overrIDe init(frame: CGRect) {        super.init(frame: frame)        self.backgroundcolor = UIcolor.JsBrandBlack()        self.setupSubvIEws()    }    init() {        super.init(frame: CGRect.zero)        self.backgroundcolor = UIcolor.JsBrandBlack()        self.setupSubvIEws()    }    required init?(coder aDecoder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }    // MARK: subvIEw setup    func setupSubvIEws() {        self.setupTutorialVIDeoVIEw()        self.setupTutorialLabel()        self.setupConstraints()        self.addConstraints(self.autolayoutConstraints)    }    func setupTutorialVIDeoVIEw() {        self.vIDeoPlayerVIEw.translatesautoresizingMaskIntoConstraints = false        self.vIDeoPlayerVIEw.backgroundcolor = UIcolor.bluecolor()        if let player = self.tutorialVIDeoPlayer {            self.vIDeoPlayerVIEw.player = player        }        self.addSubvIEw(self.vIDeoPlayerVIEw)    }    func setupTutorialLabel() {        self.tutorialLabel.translatesautoresizingMaskIntoConstraints = false        self.tutorialLabel.textcolor = UIcolor.JslightGray()        self.tutorialLabel.Font = UIFont.JsH3WithWeight(.normal)        self.tutorialLabel.numberOflines = 0        self.tutorialLabel.textAlignment = .Center        self.addSubvIEw(self.tutorialLabel)    }    func setupConstraints() {        let vIEws:[String:AnyObject] = [            "vIDeo" : self.vIDeoPlayerVIEw,"text" : self.tutorialLabel        ]        self.autolayoutConstraints.appendContentsOf(            NSLayoutConstraint.constraintsWithVisualFormat(                "V:|-margintop--marginBottom-[text(text@750)]-|",options: .AlignAllCenterX,metrics: self.metrics,vIEws: vIEws            )        )        self.autolayoutConstraints.appendContentsOf(            NSLayoutConstraint.constraintsWithVisualFormat(                "H:|-marginleft--marginRight-|",options: NSLayoutFormatoptions(),vIEws: vIEws            )        )        self.autolayoutConstraints.appendContentsOf(            NSLayoutConstraint.constraintsWithVisualFormat(                "H:|-marginleft-[text]-marginRight-|",vIEws: vIEws            )        )    }    // MARK: vIDeo setup    func setVIDeo(url:NSURL) {        self.tutorialVIDeoPlayer = AVPlayer(URL: url)        self.vIDeoPlayerVIEw.player = self.tutorialVIDeoPlayer        let playerLayer:AVPlayerLayer = self.vIDeoPlayerVIEw.layer as! AVPlayerLayer        playerLayer.frame = self.vIDeoPlayerVIEw.frame        playerLayer.vIDeoGravity = AVLayerVIDeoGravityResizeAspectFill    }    func playVIDeo() {        let playerLayer = self.vIDeoPlayerVIEw.layer as! AVPlayerLayer        if playerLayer.readyFordisplay {            self.tutorialVIDeoPlayer.play()        } else {            print("Player not ready to play")        }    }    func pauseVIDeo() {        self.tutorialVIDeoPlayer.pause()    }    // MARK: layout Hack    overrIDe func layoutSubvIEws() {        super.layoutSubvIEws()        self.tutorialLabel.preferredMaxLayoutWIDth = CGRectGetWIDth(self.tutorialLabel.bounds)        super.layoutSubvIEws()    }}

在我的视图控制器中,我设置了UICollectionVIEwCell(以及我试图显示的视频的URL),如下所示:

let cell:JsOnBoardingTutorialPageVIEw = collectionVIEw.dequeueReusableCellWithReuseIDentifIEr(self.CollectionVIEwCellReuseIDentifer,forIndexPath: indexPath) as! JsOnBoardingTutorialPageVIEwif let index = JsOnBoardingTutorialPage(rawValue: indexPath.row) {    cell.setVIDeo((self.pageData[index]?.vIDeo)!)    print(String(format: "vIDeo url: %@",(self.pageData[index]?.vIDeo)!))    cell.tutorialText = (self.pageData[index]?.text)!    cell.playVIDeo()}return cell

如何让我的视频显示在其容器JsAVPlayerVIEw中?

解决方法 我认为问题是你永远不会调用AVPlayer的构造函数(据我所知,从你提供的代码中可以看到).有一个函数func setVIDeo(url:NSURL),但你没有调用这个函数. 总结

以上是内存溢出为你收集整理的swift – AVPlayer / AVPlayerLayer没有出现在使用自动布局的子视图中全部内容,希望文章能够帮你解决swift – AVPlayer / AVPlayerLayer没有出现在使用自动布局的子视图中所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1002453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存