Как сделать так, чтобы UIStackView заполнял абсолютно одинаково? - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над сценарием, использующим вложенные экземпляры UIStackView (вертикальный UIStackView, содержащий множество от одного до нескольких горизонтальных экземпляров UIStackView), чтобы создать сетку ячеек одинакового размера, каждый из которых может содержать любой UIView.Предполагается, что это гибкий холст для множества игр, в которых пользователь может варьировать размеры от игры к игре (например, тральщик, поиск слов, кроссворд, игры с тайлами), поэтому содержимое представления UIStack не помещается вручную в Interface Builder.

Пользователь отметил сценарий, в котором для вертикального UIStackView задано 22 строки контента, а для iPhone X - distribution = .fillEqually, большинство строк имеют высоту 33,33, а две - 33,67.Конечно, они на самом деле не равны, но в демонстрационной версии текст был масштабирован настолько, насколько это позволялось высотой строки, и эти размеры приводили к тексту двух разных размеров на экране с предположительно одинаковым размером содержимого.

Image of problem

Чтобы создать это, я создал новый проект в Xcode, добавил UIStackView в Interface Builder и реализовал следующий ViewController:

class ViewController: UIViewController {

    @IBOutlet weak var stackView: UIStackView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        stackView.distribution = .fillEqually
        for _ in 0..<22 {
            let newLabel = UILabel(frame: CGRect(x: 10, y: 10, width: 1, height: 10))
            newLabel.font = newLabel.font.withSize(576.0)
            newLabel.minimumScaleFactor = 0.01
            newLabel.adjustsFontSizeToFitWidth = true
            newLabel.lineBreakMode = .byClipping
            newLabel.numberOfLines = 0
            newLabel.textAlignment = .center
            newLabel.text = "The quick brown fox..."

            stackView.addArrangedSubview(newLabel)
        }

        DispatchQueue.main.async {
            self.stackView.arrangedSubviews.forEach({ (view) in
                if let label = view as? UILabel {
                    label.text = "The quick brown fox... \(Double(Int(label.frame.height*100))/100)"
                }
            })
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Что можетЯ делаю по-другому, чтобы преодолеть это неравенство по высоте, кроме ограничения поддерживаемых устройств или количества строк, либо изменения способа использования существующих элементов UIKit, либо поддержки той же концепции динамической сетки UIViews одинакового размера через другие классы UIKit?Мое текущее решение состоит в том, чтобы использовать пропорциональную заливку, добавить пустую строку пэда внизу и изменять ее внутренний размер до тех пор, пока все предполагаемые строки не будут равны, и это кажется ужасным.

Спасибо!Mark

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