我正在使用嵌套UIStackView实例(一个垂直的UIStackView包含多个一对多的水平UIStackView实例)创建一个大小相等的单元格的网格,每个单元格可以包含任何UIView。它旨在用作各种游戏的灵活画布,用户可以根据不同游戏(例如扫雷,找字,填字游戏,平铺游戏)改变尺寸,因此UIStack视图内容不会手动放置在Interface Builder中
一个用户注意到了这样一个场景:在垂直的UIStackView和distribution = .fillEqually
中给定22行内容,在iPhone X上,大多数行的高度为33.33,而两行为33.67。当然,它们实际上并不相等,但是演示程序将文本缩放到与行高所允许的大小一样大,并且这些大小导致屏幕上的两个大小不同的文本在大小上都相等。
为此,我用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类?我当前的解决方案是使用比例填充,在底部添加一个空的填充行,并调整其固有大小,直到预期的行都相等为止,这看起来很糟糕。
谢谢! 标记