如何使UIStackView完全均匀填充?

时间:2018-09-11 21:05:50

标签: ios swift uistackview

我正在使用嵌套UIStackView实例(一个垂直的UIStackView包含多个一对多的水平UIStackView实例)创建一个大小相等的单元格的网格,每个单元格可以包含任何UIView。它旨在用作各种游戏的灵活画布,用户可以根据不同游戏(例如扫雷,找字,填字游戏,平铺游戏)改变尺寸,因此UIStack视图内容不会手动放置在Interface Builder中

一个用户注意到了这样一个场景:在垂直的UIStackView和distribution = .fillEqually中给定22行内容,在iPhone X上,大多数行的高度为33.33,而两行为33.67。当然,它们实际上并不相等,但是演示程序将文本缩放到与行高所允许的大小一样大,并且这些大小导致屏幕上的两个大小不同的文本在大小上都相等。

Image of problem

为此,我用Xcode创建了一个新项目,在Interface Builder中添加了UIStackView,并实现了以下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类?我当前的解决方案是使用比例填充,在底部添加一个空的填充行,并调整其固有大小,直到预期的行都相等为止,这看起来很糟糕。

谢谢! 标记

0 个答案:

没有答案