Swift: переключатели в StackView не отображаются должным образом - PullRequest
0 голосов
/ 01 сентября 2018

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

Я хочу, чтобы все мои кнопки были правильно выровнены по левому краю, поскольку я могу решить эту проблему, спасибо! And here is the result in photo:

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

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
}

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Проблема в том, как вы пытаетесь установить 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, я предлагаю вам прочитать этот фантастический ответ .

0 голосов
/ 01 сентября 2018

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

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