2017-08-26 107 views
3

我试图以编程方式将视频约束到页面的中心。我的影音控制器被称为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 
+0

设置框架与设置约束不一样。布局实际上是在viewDidLayoutSubviews中完成的 – Pruthvikar

+2

这并不是说你问很多问题,而是删除问题并重新提问!两个小时前,你问这个,像@Pruthvikar,我评论说你不应该设置框架。我还详细说明了要做的三件事情,并且*您*评论了要求提供的代码。我可以那样做,但是你也会删除这个问题吗? – dfd

+0

所以对不起我我承诺 – Hamza

回答

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以及UILayoutGuide,您可以使您的布局适应Apple向您投放的任何屏幕尺寸。

+0

谢谢!!!!你能问我一个问题吗? :) – Hamza

1

你可以试试这个

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 
    } 

} 
+0

谢谢!!!!你能问我一个问题吗? :) – Hamza

相关问题