我有一个简单的UIViewRepresentable的MarqueeLabel,但它不工作。我的猜测是,框架没有正确设置,但我不知道作为框架传递给MarqueeLabel初始化程序的是什么。使用几何学读取器或其他方法来获得Marquee效果不是一种选择。
struct UILabelView : UIViewRepresentable {
var text: String
typealias UIViewType = MarqueeLabel
func makeUIView(context: UIViewRepresentableContext<UILabelView>) -> MarqueeLabel {
let label = MarqueeLabel()
print(label.frame.size)
label.text = text
return label
}
func updateUIView(_ uiView: MarqueeLabel, context: UIViewRepresentableContext<UILabelView>) { }
}我试过使用this,但没有效果。另外,我看过this Question,但没有答案。
视图的用法如下:
UILabelView(text: "a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20")在此视图上设置.frame(width: 40)无助于此。
发布于 2022-07-04 11:24:52
默认情况下,它是由内部内容扩展到全宽度的,因此MarqueeLabel只是没有什么可滚动的东西--所有内容都在框架内。
在这种情况下,我们需要赋予父级将内部视图缩小到外部可用空间的能力(在这种情况下,按宽度显示)
因此,这里有一个减少阻力的固定优先级:
func makeUIView(context: UIViewRepresentableContext<UILabelView>) -> MarqueeLabel {
let label = MarqueeLabel()
label.text = text
label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
// ^^^^^ << this one !!
return label
}

用Xcode 13.4 / iOS 15.5测试
https://stackoverflow.com/questions/72855423
复制相似问题