我正在使用SwiftUI,但是我已经创建了一个可表示的UITextView
。
我想将插图设置为系统默认填充,以使其与应用程序的其余部分匹配。
这是我现在正在使用的:
UITextView().textContainerInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15)
这看起来不错,但如果可能的话,我真的更愿意使用默认的系统填充。
padding()
的文档规定以下内容:
长度
在每个边上插入此视图的数量。如果为nil,则为系统默认值。
如何获取默认的系统填充CGFloat
值?
答案 0 :(得分:1)
因此,我制作了一个宽度/高度为0的矩形,并在其顶部放置了默认填充,然后读取该矩形的高度(即默认填充的大小),并将其存储在绑定的CGFloat中。它也会隐藏自己。
然后可以将该值传递到UITextView包装器中。
struct Defaults: View {
@Binding var padding: CGFloat
@State var isHidden = false
@ViewBuilder
var body: some View {
if !isHidden {
Rectangle()
.frame(width: 0, height: 0)
.padding(.top)
.background(GeometryReader { geometry in
Rectangle().onAppear {
self.padding = geometry.size.height
self.isHidden = true
}
})
}
}
}
struct Example: View {
@State var padding = CGFloat()
@ViewBuilder
var body: some View {
Defaults(padding: $padding)
Rectangle().frame(width: padding, height: padding)
}
}
答案 1 :(得分:0)
我不知道您的确切用例,但是一种可能的解决方法是使用容器堆栈(例如 VStack 和 GeometryReader 。然后将可用宽度传递给 UIViewRepresentable ,并将其设置为 preferredMaxLayoutWidth 。
VStack(alignment: .leading) {
GeometryReader { geometry in
UIKitLabel(width: geometry.size.width,
attributedString: NSAttributedString(string: "Hello"))
.fixedSize()
.layoutPriority(0)
}
}.padding()
然后在自定义组件的 makeUIView 方法中,执行以下操作:
func makeUIView(context: Context) -> UILabel {
let label = UILabel(frame:CGRect.zero)
label.preferredMaxLayoutWidth = width
return label
}