Как я могу быстро получить кадр супервизора? - PullRequest
0 голосов
/ 09 июля 2020

Я хочу создать несколько кнопок и разместить их внутри uiview и подогнать под uiview. (Как на картинке)

Мне нужно получить рамку uiview для вычисления и разделения по мере необходимости, чтобы установить ширину и высоту кнопки в зависимости от на размер устройства.

        for row in 0 ..< 4 {
        for col in 0..<3 {
            let numberButton = UIButton()
            numberButton.frame = CGRect(x: Int(buttonView.frame.width / 3 - 20) * col, y: row * (320 / 4), width: Int(buttonView.frame.width) / 3, height: Int(buttonView.frame.height) / 4)
            numberButton.setTitle("button", for: .normal)
            numberButton.titleLabel?.font = numberButton.titleLabel?.font.withSize(30)
            numberButton.setTitleColor(UIColor.black)

            buttonView.addSubview(numberButton)
        }

    }

Я пробовал аналогичный код, приведенный выше, но buttonView.frame.width возвращает ноль.

Как я могу вычислить фрейм этого представления? * введите описание изображения здесь

1 Ответ

1 голос
/ 09 июля 2020

Вы можете использовать UIStackView s для достижения этой разметки сетки. Таким образом, вам не нужно рассчитывать рамки каждой кнопки. В любом случае это плохая практика. Вместо этого вы должны использовать ограничения AutoLayout для макета ваших представлений. Вот учебник , чтобы вы начали.

В любом случае, вот как вы могли бы использовать UIStackView s для создания сетки кнопок:

// here I hardcoded the frame of the button view, but in reality you should add
// AutoLayout constraints to it to specify its frame
let buttonView = UIStackView(frame: CGRect(x: 0, y: 0, width: 600, height: 320))
buttonView.alignment = .fill
buttonView.axis = .vertical
buttonView.distribution = .fillEqually
buttonView.spacing = 20 // this is the spacing between each row of buttons
for _ in 0..<4 {
    var buttons = [UIButton]()
    for _ in 0..<3 {
        let numberButton = UIButton(type: .system)
        numberButton.setTitle("button", for: .normal)
        numberButton.titleLabel?.font = numberButton.titleLabel?.font.withSize(30)
        numberButton.setTitleColor(UIColor.black, for: .normal)
        // customise your button more if you want...
        buttons.append(numberButton)
    }
    let horizontalStackView = UIStackView(arrangedSubviews: buttons)
    horizontalStackView.alignment = .fill
    horizontalStackView.axis = .horizontal
    horizontalStackView.distribution = .fillEqually
    horizontalStackView.spacing = 20 // this is the spacing between each column of buttons
    buttonView.addArrangedSubview(horizontalStackView)
}

Результат с игровой площадки быстрый просмотр:

введите описание изображения здесь

...