SwiftUI также может вызывать бесконечный цикл, почему?
Это мой исходный код
import SwiftUI
struct Question01: View {
@State private var height: CGFloat = 0
var body: some View {
ScrollView(Axis.Set.vertical, showsIndicators: false) {
LazyVStack
{
ForEach(0..<100) { _ in
GridentLabel(fontSize: 14, fontColor: UIColor.red, transfromColor: UIColor.black, content: "ttttttttttttttttttttbbbbbbbbbbbbbbbbbtttttttttttttttttttttttttt", transfromContent: "bbbbbbbbbbbbbbbbb", labelHeight: $height)
.frame(height: height)
}
}
}
}
}
struct Question01_Previews: PreviewProvider {
static var previews: some View {
Question01()
}
}
struct GridentLabel: UIViewRepresentable {
let fontSize: CGFloat
let fontColor: UIColor
let transfromColor: UIColor
let content: String
let transfromContent: String
@Binding var labelHeight: CGFloat
func makeUIView(context: Context) -> UILabel {
let label = UILabel(frame: .zero)
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
return label
}
func updateUIView(_ uiView: UILabel, context: Context) {
if content.isEmpty == false {
let paragraph = NSMutableParagraphStyle()
paragraph.lineSpacing = 5.0
paragraph.lineBreakMode = NSLineBreakMode.byCharWrapping
let attrString = NSMutableAttributedString(string: content, attributes: [.paragraphStyle : paragraph, .font: UIFont.systemFont(ofSize: fontSize, weight: .regular), .foregroundColor: fontColor])
let range: NSRange = (content as NSString).range(of: transfromContent)
attrString.addAttribute(NSAttributedString.Key.foregroundColor, value: transfromColor, range: range)
uiView.attributedText = attrString
DispatchQueue.main.async {
labelHeight = uiView.sizeThatFits(CGSize(width: uiView.bounds.width, height: CGFloat.greatestFiniteMagnitude)).height
}
}
}
}
Почему использование фрейма коллекции LazyVstack вызывает бесконечный цикл? Я до сих пор не могу понять такую проблему. Если вы используете Vstack напрямую, бесконечного цикла не будет. Почему, или если вы не установите рамку, это не вызовет бесконечного цикла. Хотя не установка рамки никак не повлияет на программу, но почему это так?