Проблема заключается в этой части описания transform
в документации Apple: https://developer.apple.com/documentation/uikit/uiview/1622459-transform
В iOS 8.0 и более поздних версиях свойство transform не влияет на Auto Layout. Автоматический макет вычисляет прямоугольник выравнивания вида на основе его нетрансформированного фрейма.
Итак, когда вы изменяете текст метки, ваши ограничения связаны с нетрансформированным фреймом .
Исправление заключается в том, чтобы вставить этикетку в «контейнер» UIView
и ограничить ширину контейнера до высоты высота до ширина этикетки.
Настройте xib следующим образом (я использую контрастные цвета фона, чтобы было удобно видеть кадры):
Обратите внимание, что я дал ограничениям ширины и высоты вида контейнера 80. Отредактируйте каждое из этих ограничений и установите их как "Заполнители":
Мы будем устанавливать новые ограничения в коде, поэтому они будут удалены во время сборки, но будут удовлетворять проверке макета IB.
В awakeFromNib()
в своем пользовательском классе добавьте новые ограничения ширины и высоты и примените преобразование вращения:
override func awakeFromNib() {
super.awakeFromNib()
// set HUGGING priority on title label to REQUIRED for both axis
chartTitleLabel.setContentHuggingPriority(.required, for: .horizontal)
chartTitleLabel.setContentHuggingPriority(.required, for: .vertical)
NSLayoutConstraint.activate([
// constrain title container view WIDTH equal to title label HEIGHT
// set the constant to add padding on left and right of rotated title label
// here it is set to 12, which gives 6-pts padding on each side
chartTitleContainerView.widthAnchor.constraint(equalTo: chartTitleLabel.heightAnchor, constant: 12.0),
// constrain title container view HEIGHT equal to title label WIDTH
chartTitleContainerView.heightAnchor.constraint(equalTo: chartTitleLabel.widthAnchor, constant: 0.0),
])
// rotate the title label
chartTitleLabel.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi/2))
// un-comment after development
// chartTitleLabel.backgroundColor = .clear
// chartTitleContainerView.backgroundColor = .clear
}
Теперь, в вашем setup()
func (где, я предполагаю, вы добавляете «представление графика» в качестве подпредставления), добавьте ограничения для представления графика:
func setup(speedArray: [Float32]) {
//Convert speed to Km/h from m/s
let speedArrayKMH = speedArray.map({$0*3.6})
// assuming setupSpeedChart() creates speedLineChart view and adds it to self
//Draw Chart
//This only styles the chart (colors, user interaction, etc...
//no code in this fuction that affects layout)
setupSpeedChart(speedArray: speedArrayKMH)
NSLayoutConstraint.activate([
// constrain chart view LEADING to title container view TRAILING
speedLineChart.leadingAnchor.constraint(equalTo: chartTitleContainerView.trailingAnchor, constant: 0.0),
// constrain chart view top, bottom and trailing to self
speedLineChart.topAnchor.constraint(equalTo: topAnchor, constant: 0.0),
speedLineChart.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0.0),
speedLineChart.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0.0),
])
}
Это результат:
и с выключенными цветами "dev":
Теперь вы можете изменить текст метки заголовка, и он останется по центру по вертикали и горизонтали, без изменения горизонтального размера / интервала.