如何获取默认的系统填充值



我正在使用SwiftUI,但我已经创建了一个可表示的UITextView

我想将insets设置为系统默认填充,使其与应用程序的其余部分匹配。

以下是我现在使用的:

UITextView().textContainerInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15)

这看起来不错,但如果可能的话,我真的更喜欢使用默认的系统填充。

padding()的文档说明如下:

长度

在每条边上插入此视图的数量。如果为零,则金额为系统默认金额。

如何获得默认的系统填充CGFloat值?

因此,我制作了一个宽度/高度为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)
}
}

我不知道你的确切用例,但一个可能的解决方法是使用容器堆栈(例如VStackGeometryReader。然后传递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
}

最新更新