Swift: переключатель в StackView не отображается должным образом

Я создал список переключателей в stackView, но не понимаю, почему они отображаются неправильно, они неправильно выровнены

Я хочу, чтобы все мои кнопки были правильно выровнены по левому краю, так как я могу решить эту проблему, спасибо! И вот результат на фото:

Вот часть кода:

var buttons = [UIButton]()
var titles = ["Lasy", "What I've been told", "I'm do into it", "Close the best i can", "Hard core"]


func setupUI() {

    for title in titles {
        // create button
        let button = UIButton(type: .custom)
        button.setTitleColor(.black, for: .normal)
        button.setTitle(title, for: .normal)
        button.setImage(UIImage(named: "uncheck.png")!, for: .normal)

        // if the selected button cannot be reclick again, you can use .Disabled state
        button.setImage(UIImage(named: "check.png")!, for: .selected)
        button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 35)
        button.addTarget(self, action: #selector(radioButtonAction), for: .touchUpInside)

        buttons.append(button)
    }

    for button in buttons {
        addArrangedSubview(button)
    }

    setupUserChoice()
}

func setupUserChoice(){
    if titles.contains(value) {
        let valueIndex = titles.index(of: value)

        radioButtonAction(sender: buttons[valueIndex!])
    }
}

func setStackView() {
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .vertical
    stackView.distribution = .fill
    stackView.spacing = 16.0
    stackView.alignment = .leading
}

person Community    schedule 01.09.2018    source источник
comment
эта проблема возникает только при нажатии кнопки?   -  person Vincent Joy    schedule 01.09.2018
comment
не смотри на предпоследний пример например он тоже не выровнен. похоже это 1 из 2   -  person    schedule 01.09.2018


Ответы (2)


Проблема в том, как вы пытаетесь установить imageEdgeInsets. Это только регулировка положения изображения, а не увеличение размера кнопки соответственно. Для увеличения размера кнопки необходимо установить contentEdgeInsets. Но вам также необходимо настроить положение заголовка в соответствии с изменением положения изображения. Для этого вы можете использовать titleEdgeInsets.

Поэтому удалите код button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 35) и замените его на: -

let leftPadding_beforeImage: CGFloat = 35
let gapBetweenImageAndTitle: CGFloat = 8
let rightPadding_afterTitle: CGFloat = 16

button.imageEdgeInsets = UIEdgeInsetsMake(0, leftPadding_beforeImage, 0, 0)
button.titleEdgeInsets = UIEdgeInsetsMake(0, (leftPadding_beforeImage+gapBetweenImageAndTitle), 0, -(leftPadding_beforeImage+gapBetweenImageAndTitle))
button.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, (leftPadding_beforeImage+gapBetweenImageAndTitle+rightPadding_afterTitle))

Я надеюсь, что имена переменных говорят сами за себя. Если вы хотите узнать больше о UIButton edgeInsets, я предлагаю вам прочитать этот фантастический ответ.

person Vincent Joy    schedule 02.09.2018
comment
Тамкс мой друг! - person ; 02.09.2018

Установите рамку каждой кнопки, потому что UIStackViews используют внутренний размер содержимого. Например :

button.frame = CGRect(x: 0, y: 0, width: 100, height: 20)
person ielyamani    schedule 01.09.2018