как использовать UITraitCollection в swift?
нужно изменить constraints в зависимости от положения телефона с использованием UITaitCollection, как это сделать?
class ViewController: UIViewController {
var redView: UIView!
var blueView: UIView!
override func loadView() {
view = UIView()
view.backgroundColor = .white
redView = UIView()
redView.translatesAutoresizingMaskIntoConstraints = false
redView.backgroundColor = .red
view.addSubview(redView)
blueView = UIView()
blueView.translatesAutoresizingMaskIntoConstraints = false
blueView.backgroundColor = .blue
view.addSubview(blueView)
NSLayoutConstraint.activate([
redView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor, constant: 16),
redView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor, constant: 16),
redView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor, constant: -16),
redView.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 0.5),
blueView.topAnchor.constraint(equalTo: redView.bottomAnchor, constant: 16),
blueView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor, constant: -16),
blueView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor, constant: 16),
blueView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor, constant: 16),
blueView.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 0.5, constant: -16),
])
}
}
это очень неудачная попытка
func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
redView = UIView()
redView.translatesAutoresizingMaskIntoConstraints = false
redView.backgroundColor = .red
view.addSubview(redView)
blueView = UIView()
blueView.translatesAutoresizingMaskIntoConstraints = false
blueView.backgroundColor = .blue
view.addSubview(blueView)
if traitCollection.horizontalSizeClass == .compact {
NSLayoutConstraint.activate([
redView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor, constant: 16),
redView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor, constant: 16),
redView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor, constant: -16),
redView.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 0.5),
blueView.topAnchor.constraint(equalTo: redView.bottomAnchor, constant: 16),
blueView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor, constant: -16),
blueView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor, constant: 16),
blueView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor, constant: 16),
blueView.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 0.5, constant: -16),
])
} else {
}
}
Ответы (1 шт):
Автор решения: Oleg Soloviev
→ Ссылка
Констрейнты в ViewController уже реагируют на поворот экрана, попробуйте вот так:
import UIKit
class ViewController: UIViewController {
var redView: UIView!
var blueView: UIView!
override func loadView() {
view = UIView()
view.backgroundColor = .white
redView = UIView()
redView.translatesAutoresizingMaskIntoConstraints = false
redView.backgroundColor = .red
view.addSubview(redView)
blueView = UIView()
blueView.translatesAutoresizingMaskIntoConstraints = false
blueView.backgroundColor = .blue
view.addSubview(blueView)
NSLayoutConstraint.activate([
redView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor, constant: 16),
redView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor, constant: 16),
redView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor, constant: -16),
redView.heightAnchor.constraint(equalTo: blueView.heightAnchor),
blueView.topAnchor.constraint(equalTo: redView.bottomAnchor, constant: 16),
blueView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor, constant: 16),
blueView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor, constant: -16),
blueView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor, constant: -16),
])
}
}
А вообще, вначале нужно деактивировать используемые констрейнты:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .compact {
NSLayoutConstraint.deactivate(...)
NSLayoutConstraint.activate(...)
} else {
...
}
}