Это решение работает с Swift 3 и уважает оригинальный контент и края изображения врезки, сохраняя при этом указанное в заголовке метку всегда, расположенную в центре свободного пространства, что делает намного проще регулировочные поля.
Он переопределяет titleRect(forContentRect:)
метод и возвращает правильный кадр:
@IBDesignable
class LeftAlignedIconButton: UIButton {
override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
let titleRect = super.titleRect(forContentRect: contentRect)
let imageSize = currentImage?.size ?? .zero
let availableWidth = contentRect.width - imageEdgeInsets.right - imageSize.width - titleRect.width
return titleRect.offsetBy(dx: round(availableWidth/2), dy: 0)
}
}
следующие углублени:
результат будет в этом:
Устаревшее предыдущий ответ
Это работает в большинстве случаев, но некоторые макеты вызывают layoutSubviews
рекурсивно вызывать себя в бесконечном цикле, так использовать с осторожностью.
@IBDesignable
class LeftAlignedIconButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
contentHorizontalAlignment = .left
let availableSpace = UIEdgeInsetsInsetRect(bounds, contentEdgeInsets)
let availableWidth = availableSpace.width - imageEdgeInsets.right - (imageView?.frame.width ?? 0) - (titleLabel?.frame.width ?? 0)
titleEdgeInsets = UIEdgeInsets(top: 0, left: availableWidth/2, bottom: 0, right: 0)
}
}
Этот код будет делать то же самое, но совместив значок к правому краю:
@IBDesignable
class RightAlignedIconButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
semanticContentAttribute = .forceRightToLeft
contentHorizontalAlignment = .right
let availableSpace = UIEdgeInsetsInsetRect(bounds, contentEdgeInsets)
let availableWidth = availableSpace.width - imageEdgeInsets.left - (imageView?.frame.width ?? 0) - (titleLabel?.frame.width ?? 0)
titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: availableWidth/2)
}
}
Правая версия правка использует semanticContentAttribute
поэтому она требует IOS 9+.
Спасибо! Именно то, что я искал. –
Вынос здесь для меня состоял в том, чтобы установить горизонтальное выравнивание содержимого влево, а не по умолчанию. Сам текст по-прежнему сосредоточен в области текста. Ваше магическое число «42» здесь - это ширина изображения, легко вычисляемая. –