, Тем не менее, layOutIfNeeded, похоже, решил проблему, хотя почему это требуется в Xcode 10 / iOS 12, также является загадкой.
то работало вчера под 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, также является загадкой.