Увеличение высоты кнопки при увеличении размера текста в Swift - PullRequest
0 голосов
/ 25 марта 2020

Я очень плохо знаком с autolayout, и я боролся с одной вещью.

enter image description here

Roll btn в BottomView - I Я пытаюсь увеличить его высоту в соответствии с размером текста. Как вы можете видеть, высота textlabel btn увеличивается, но height btn не является.

constraints, который я применил:

1) Horizontallly и verticallly по центру суперпредставления

2) Leading и trailing по суперпредставлению

3) Я также пытался установить ограничение высоты на greaterThanEqualTo a constant. Но это не сработало

4) Я тоже попробовал SizeToFit. Не работает

5) Я установил ссылку lineBreak как WordWrap и number of lines в titleLabel как 0. Все еще не работает

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Когда вы изменяете .titleLabel из UIButton, автоматическая разметка не учитывает ваши изменения.

Чтобы получить правильную многострочную кнопку автоматического определения размера, вам необходимо создать подкласс и возвращает действительный .intrinsicContentSize.

Вот краткий пример:

@IBDesignable
class MultilineButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        commonInit()
        setNeedsLayout()
    }

    func commonInit() -> Void {
        self.titleLabel?.numberOfLines = 0
        self.titleLabel?.textAlignment = .center
        self.contentEdgeInsets = UIEdgeInsets(top: 8.0, left: 8.0, bottom: 8.0, right: 8.0)
    }

    override var intrinsicContentSize: CGSize {
        let size = self.titleLabel!.intrinsicContentSize
        return CGSize(width: size.width + contentEdgeInsets.left + contentEdgeInsets.right, height: size.height + contentEdgeInsets.top + contentEdgeInsets.bottom)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        titleLabel?.preferredMaxLayoutWidth = self.titleLabel!.frame.size.width
    }

}

Класс помечен @IBDesignable, поэтому вы можете использовать его в Storyboard / Interface Builder и получать точные результаты. .

Вот вид (в раскадровке) 3 экземпляров этой кнопки. Сначала с коротким заголовком, поэтому его не нужно переносить; затем с заголовком, который делает перенос; и третий с заголовком со встроенными символами новой строки:

enter image description here

Обратите внимание, что этот пример явно устанавливает Content Edge Insets в 8 пунктов на всех 4 сторонах. Если вы хотите изменить это для отдельных кнопок, потребуется небольшое редактирование.

0 голосов
/ 25 марта 2020

я использовал это решение для динамического изменения высоты uilabal, вы можете получить это расширение, чтобы получить высоту и ширину строки

extension String {
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
    let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
    let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

    return ceil(boundingBox.height)
}

func width(withConstrainedHeight height: CGFloat, font: UIFont) -> CGFloat {
    let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
    let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

    return ceil(boundingBox.width)
}

}

, так как вы используете раскадровку по высоте и ширине константа, затем свяжите их со скриптом viewcontroller

YourContrainsHeight.constant = SomeString.height

YourContrainsWidth.constant = SomeString.width
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...