Все это работало вчера под Xcode 9 и iOS 11;однако после обновления до Xcode 10 и iOS 12 представление больше не отображается.У меня было видео, отображаемое в представлении.Сегодня я слышал, но не видел видео.Я проверил кадр и обнаружил, что он равен нулю, что объясняет проблему.Однако ничего не изменилось по сравнению с предыдущей версией.Я удалил видео и только что посмотрел на кадр представления после применения ограничений привязки, и все они равны нулю.
import UIKit
import AVKit
class VideoView: UIView {
private var videoURL:URL!
private var parentView:UIView!
private var avPlayer:AVPlayer!
private var avPlayerLayer:AVPlayerLayer!
init(url:URL, parentView:UIView) {
super.init(frame: .zero)
self.videoURL = url
self.parentView = parentView
setup()
}
private func setup() {
self.translatesAutoresizingMaskIntoConstraints = false
self.parentView.addSubview(self)
self.topAnchor.constraint(equalTo: self.parentView.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
self.leadingAnchor.constraint(equalTo: self.parentView.leadingAnchor, constant: 8).isActive = true
self.trailingAnchor.constraint(equalTo: self.parentView.trailingAnchor, constant: -8).isActive = true
self.heightAnchor.constraint(equalToConstant: 200).isActive = true
print(self.parentView.frame)
print(self.frame)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
обратите внимание на два оператора печати в конце setup()
.parentView
возврат 0,0,414,736
.Представление self
возвращает 0,0,0,0
.
Если в Init
я установлю размер кадра, он будет соответствовать;тем не менее, он не применяет якорные ограничения, поэтому размер представления останется таким, каким я его ввел в init.
Похоже, что якорные ограничения вообще не принимаются во внимание.В них нет ошибок в отладчике, и, как мы видим, translatesAutoresizingMaskIntoConstraints
установлен на false
, а для всех ограничений isActive
установлен на true
.
Изменились только версия Xcode и iOS.Чего мне не хватает?
Обновление 1:
Если я создаю ярлык и добавляю его в self
, ярлык отображается нормально.Если я создаю цвет фона для self
, это также показывает отлично, включая правильную высоту, как установлено с помощью якорных ограничений.Тем не менее, кадр остается на нуле.Поэтому, когда вы пытаетесь добавить AVPlayerLayer
, устанавливая его кадр в пределах self
, он не работает, потому что self
остается на нуле.Таким образом, остается вопрос, почему размеры кадра не меняются после инициализации.
Обновление 2:
Я добавил self.layoutIfNeeded()
сразу после применения якорных ограничений, и это, похоже, решило проблему.Хотя, глядя на рамку для self
, я получаю -199,-100,398,200
Не могу сказать, что понимаю значения для X and Y
.Тем не менее, layOutIfNeeded
, кажется, решил проблему, хотя почему это требуется в Xcode 10 / iOS 12, также является загадкой.