【问题标题】:why do my constraint not work properly in swift/storyboard?为什么我的约束在 swift/storyboard 中不能正常工作?
【发布时间】:2017-01-30 07:52:51
【问题描述】:

我正在使用player-swift(那个:https://github.com/piemonte/Player)在我的应用中显示视频内容。我创建了一个UIViewController,在那里添加了一个view 并为其分配了一个名为PlayerView 的类。到目前为止一切顺利。

在我的代码中,我按如下方式启动它:

self.videoPlayer = Player()
self.videoPlayer.delegate = self
self.videoPlayer.view.frame = myVideo.bounds

self.addChildViewController(self.videoPlayer)
myVideo.addSubview(self.videoPlayer.view)
self.videoPlayer.didMoveToParentViewController(self)
  let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGestureRecognizer(_:)))
   tapGestureRecognizer.numberOfTapsRequired = 1
   self.videoPlayer.view.addGestureRecognizer(tapGestureRecognizer)

self.videoPlayer.fillMode = "AVLayerVideoGravityResizeAspectFill"

self.videoPlayer.setUrl(url)

self.videoPlayer.playFromBeginning()
self.videoPlayer.playbackLoops = true

现在,由于我正在播放的视频格式为 480x640(纵向模式),我考虑分配以下约束:

现在,当我在 iphone 6s plus 上打开它时,我看到了:

所以 - 既然我把尾随空格设置为 0 - 为什么屏幕右侧仍然有这个白色条纹?

另一方面,在 iphone 4s 上,视频被裁剪:

在 iphone 6 上很好:

我应该应用什么样的约束才能使其在每台设备上的外观与在 iphone 6 上的外观相同?我只是希望它水平拉伸,然后垂直长度应该自动调整到它(以便保持纵横比 480x640)

===============================================

伙计们,正如我在下面的评论部分中所写 - 当我移除播放器并离开具有相同约束的正常视图时 - 一切正常,所以它一定是播放器本身的错......你能帮我区分什么那里可能有问题?

===============================================

在我的Storyboard 中,我将playerView 的颜色设置为浅灰色。我再次运行模拟器,我看到了:

这意味着还有一些其他层可以存储播放器视图本身。我浏览了插件的代码,发现了这个:

public override func loadView() {
    self.playerView = PlayerView(frame: CGRectZero)
    self.playerView.fillMode = AVLayerVideoGravityResizeAspect
    self.playerView.playerLayer.hidden = true
    self.view = self.playerView
}

这里https://github.com/piemonte/Player/blob/master/Sources/Player.swift

所以我假设我需要以某种方式设置约束:self.playerView.playerView。但是我该怎么做呢?

【问题讨论】:

  • 你在哪里调用你的代码? viewDidLoad?
  • 是的,视图确实加载了,我想也许我应该以某种方式从代码而不是故事板设置约束,但仍然......如果我设置它应该没问题(在我看来)在故事板本身上......
  • 视图尚未在 viewDidLoad 中设置其大小。尝试从 viewDidAppear 调用它,看看它的行为是否不同
  • @BJHStudios 嗯,我将播放器的代码移动到 viewDidAppear,但现在我看不到播放器本身,只有白色面板...似乎一次没有加载:|
  • 我认为,或者更确切地说,我确信,这是这个插件的错误 - 当我从视图中删除播放器并添加了一个普通的 view 时(具有相同的约束) - 现在一切正常。 .. 所以现在我只需要一些帮助来区分这个播放器出了什么问题以及如何修复它:)

标签: ios swift storyboard constraints nslayoutconstraint


【解决方案1】:

对侧边距的约束必须为 -20,这样视频才能全屏显示,0 留下额外的空间,如果将视图拖动到边距的边缘,您可以看到这一点,我建议使用 ctrl 拖动到主视图并为其父视图分配相等的宽度

【讨论】:

  • @LuizPerez 我刚刚在我的主要问题中添加了更多信息,你能看看它并告诉我它是否正确以及我应该如何继续?
  • 好吧,让我直说吧,您是在将播放器视图添加到主视图中,对吧?您可以从情节提要设置宽度,只需 ctrl+从播放器视图拖动到主视图并选择相等的宽度,现在如果播放器在子视图中并且播放器本身是另一个视图,则意味着您有 3 层对吗? (mainView、childView 和 playerView),告诉我这是否正确
  • 所以看起来是这样的:imgur.com/IFSI1VS 所以好像我有 2 层,我不知道如何到达第三层(存储播放器本身的确切层)...
  • 这里设置了我要设置约束的层(或者至少我希望是那个):myVideo.addSubview(self.videoPlayer.view) 那么如何从代码中设置该特定视图的约束,因为我无法从故事板访问它?
  • 好的,我想我明白了,在视图控制器上添加另一个视图,设置你想要的视频大小的约束(你可以设置相等的宽度、垂直间距和高度),我们将它命名为 videoContainerView ,然后在代码上,更改修改它与这一行 self.player.view.frame = self.videoContainerView.bounds ,然后添加 videoContainerView.addChildViewController(self.player) 然后 videoContainerView.addSubview(self.player.view),这个将添加嵌套在您创建的视图中的播放器视图,并将设置相同的大小,尝试并告诉我是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多