Как быстро получить кадр кадра супервизора?

Я хочу создать несколько кнопок и поместить их внутри 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 возвращает ноль.

Как я могу рассчитать кадр этого представления?

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


person alphonse    schedule 09.07.2020    source источник
comment
Это отличная возможность использовать UIStackView.   -  person Sweeper    schedule 09.07.2020
comment
@Sweeper Итак, как я могу получить высоту супервизора, чтобы установить высоту стека?   -  person alphonse    schedule 09.07.2020
comment
У вас действительно неправильный подход. Вам не нужно рассчитывать высоту/ширину каждой кнопки. Вместо этого вы должны использовать AutoLayout и Stack Views, которые будут автоматически рассчитывать кадры представлений и помогут вам адаптировать макет к разным размерам экрана.   -  person Sweeper    schedule 09.07.2020
comment
Я думаю, вы неправильно поняли. buttonView будет UIStackView. Вам просто нужно добавить ограничения к buttonView (рекомендуется) или установить buttonView.frame на что-то, и тогда рамки кнопки изменятся автоматически. Смотрите мой ответ.   -  person Sweeper    schedule 09.07.2020


Ответы (1)


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

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

// 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)
}

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

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

person Sweeper    schedule 09.07.2020
comment
Теперь я понял. Сначала я должен создать вертикальное представление стека и добавить горизонтальное представление стека, содержащее кнопки. Я пытался использовать стек, но не мог подумать, что сначала нужно создать вертикальный стек. благодарю вас - person alphonse; 09.07.2020