无法以编程方式向视频添加约束

Posted

技术标签:

【中文标题】无法以编程方式向视频添加约束【英文标题】:Can't add constraints to video programmatically 【发布时间】:2017-08-26 18:31:35 【问题描述】:

我正在尝试以编程方式将视频限制在页面中心。我的 AV 控制器叫avPlayerController

我已经给出了它的 x 和 y 值以及宽度和高度:

avPlayerController.view.frame = CGRect(x: 36 , y: 20, width: 343, height: 264)

那么我该如何居中呢?

我已经试过了:Programmatically Add CenterX/CenterY Constraints

但是,你可以猜到它不起作用:(

这是我的代码:

 super.viewDidLoad()
        let filepath: String? = Bundle.main.path(forResource: "rockline", ofType: "mp4")
        let fileURL = URL.init(fileURLWithPath: filepath!)


        avPlayer = AVPlayer(url: fileURL)


        let avPlayerController = AVPlayerViewController()
        avPlayerController.player = avPlayer
        avPlayerController.view.frame = CGRect(x: 36 , y: 20, width: 343, height: 264)

        //  hide/show control
        avPlayerController.showsPlaybackControls = false
        // play video

        avPlayerController.player?.play()
        self.view.addSubview(avPlayerController.view)
    avPlayerController.view.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

【问题讨论】:

设置框架与设置约束不同。布局其实是在viewDidLayoutSubviews中完成的 这不是你问了很多问题,你是在删除问题并重新提问!两个小时前你问这个,就像@Pruthvikar,我评论说你不应该设置框架。我还详细说明了要做的三件事,you 回复了要求代码。我可以这样做,但你也会删除这个问题吗? 很抱歉我不会保证 【参考方案1】:

这是代码,附有解释。

永远记住,如果您使用自动布局约束,不要设置框架。布局引擎将遍历它们。如果您在代码中实例化您的视图,请不要设置框架,或者如果有必要,如果您将框架设置为 CGRect.zero,它可以最好地传达信息。 了解视图生命周期。具体来说,您可以viewDidLoad 中设置您的约束,它们应该只被创建一次。 记得将自动调整大小的掩码设置为false。这是您在代码中学习自动布局时最常见的错误。 实际上有三种创建约束的方法,以及几种激活它们的方法。在您的问题中,我认为最简单的方法是使用锚点。

这是一个将宽度为 343、高度为 264 的视图(任何视图)居中的示例:

let myView = UIView()    // note, I'm not setting any frame

override func viewDidLoad() 
    super.viewDidLoad()
    view.translatesAutoresizingMaskIntoConstraints = false
    myView.translatesAutoresizingMaskIntoConstraints = false
    myView.widthAnchor.constraint(equalToConstant: 343.0).isActive = true
    myView.heightAnchor.constraint(equalToConstant: 264.0).isActive = true
    myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

这就是它的全部内容!但是....

我建议再做一件事。不要在设置高度和宽度时使用常量。这不是“自适应”。您的 4 英寸 iPhone SE 的屏幕尺寸为 568x320,这可能看起来居中且足够大。但在屏幕尺寸为 736x414 的 iPhone Plus 上,它可能非常小。 (更不用说 12.9 英寸的 iPad Pro!)

注意我的代码如何将 superview 用于 centerX/centerY 锚点。 (而不是equalToConstant 它是equalTo。)对宽度和高度执行相同的操作。通过使用multiplierconstant 以及UILayoutGuides,您可以使您的布局适应Apple 向您提供的任何屏幕尺寸。

【讨论】:

【参考方案2】:

你可以试试这个。

avPlayerController.view.enableAutoLayoutConstraint()
avPlayerController.view.setCenterXConstraint(.equal, constantValue: 0)
avPlayerController.view.setCenterYConstraint(.equal, constantValue: 0)

extension UIView

    //Method to making translatesAutoresizingMaskIntoConstraints false.
    func enableAutoLayoutConstraint()
    
        self.translatesAutoresizingMaskIntoConstraints = false
    
    //Method to set Center-X Consttraint
    func setCenterXConstraint(_ relationType:NSLayoutRelation , constantValue:CGFloat)->NSLayoutConstraint
    
        let constraint = NSLayoutConstraint(item: self, attribute:.centerX, relatedBy: relationType, toItem: self.superview, attribute: .centerX, multiplier: 1, constant: constantValue)
        self.superview?.addConstraint(constraint)
        return constraint
    

    //Method to set Center-Y Consttraint
    func setCenterYConstraint(_ relationType:NSLayoutRelation , constantValue:CGFloat)->NSLayoutConstraint
    
        let constraint = NSLayoutConstraint(item: self, attribute:.centerY, relatedBy: relationType, toItem: self.superview, attribute: .centerY, multiplier: 1, constant: constantValue)
        self.superview?.addConstraint(constraint)
        return constraint
    


【讨论】:

以上是关于无法以编程方式向视频添加约束的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式为视频加水印

以编程方式向已以编程方式添加到表格单元格的标签添加约束

如何以编程方式向以编程方式创建的 UIView 添加约束?

以编程方式向 topLayoutGuide 添加约束?

以编程方式向 UIView 添加约束

如何以编程方式向 xib 添加约束