无法以编程方式向视频添加约束
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
。)对宽度和高度执行相同的操作。通过使用multiplier
和constant
以及UILayoutGuide
s,您可以使您的布局适应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
【讨论】:
以上是关于无法以编程方式向视频添加约束的主要内容,如果未能解决你的问题,请参考以下文章