あなたのテストプロジェクトで、私がiPhone上で動くと、layoutSubviews()
がバックグラウンドで呼び出されていません。それはiPadでのみ発生します。あなたのアプリがマルチタスクをサポートしているためだ
:
- アプリが非アクティブ化されるとは、iOSのアプリスイッチャーのためにそれのスナップショットを取るために、異なるサイズにそれをリサイズします。これらのサイズ変更により、ビューの
layoutSubviews()
が呼び出されます。それは完全に正常です。
- その後、iOSはアプリを元のサイズに戻します。
実際の問題は、「レイアウトループ」を作成していることです。 layoutSubviews()
のコードにより、独自のビューのレイアウトが無効になるため、システムはレイアウトプロセスを再度実行する必要があります。レイアウトが実行されたら、もう一度やり直してください。
具体的には、原因は次のとおりです。
self.font = UIFont(name: fontName, size: fontSize)
はあなたのラベルのフォントを変更するレイアウト処理を再度実行する必要があるように、そのsuperviewsは、更新される彼らのレイアウトを必要とするかもしれないことを意味し、そのintrinsicSizeを変化させます。 layoutSubviews()
でこれを行うのは悪い考えです。レイアウトループが発生するからです。実際には、ビュー自体ではなく、サブビューのプロパティのみを変更する必要があります。
は、なぜあなたはlayoutSubviews()
でこれを行う必要があると思いますか?おそらくレイアウトプロセスの外で、それを置くためのより良い場所があります。あなたの例では、私はこのコードが何か役に立たせるものは何も見ません。
かつてはadjustsFrameSizeToWidth
を設定するために、より理にかなって、その後、layoutSubviews()
で何もしない:
override init(frame: CGRect) {
super.init(frame: frame)
self.adjustsFontSizeToFitWidth = true
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.adjustsFontSizeToFitWidth = true
}
あなたのサイズのクラスに応じてフォントのサイズを変更しようとしている場合は、あなたが行うことができますそれを上書きしてコードでtraitCollectionDidChange()
:
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
var fontSize: CGFloat
if (self.traitCollection.horizontalSizeClass == .Regular) {
fontSize = 70
}
else {
fontSize = 30
}
self.font = UIFont(name: fontName, size:fontSize)
}
この質問をしてくれてありがとう! – Fattie