【问题标题】: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 回复了要求代码。我可以这样做,但你也会删除这个问题吗?
  • 很抱歉我不会保证

标签: swift video


【解决方案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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多