动态文本编辑器与其他视图重叠 [英] Dynamic TextEditor overlapping with other views
问题描述
所以我制作了一个成功的动态文本编辑器,但是当我尝试组合视图时,它与其他元素重叠,并且不再在您键入时展开.我很确定这与 Geometry Reader 有关,但我不知道如何做到这一点.谢谢!
So I have made a successful dynamic TextEditor but when I try to combine views, it overlaps the other elements and no longer expands as you type. I am pretty sure this has to do with Geometry Reader but I am not sure how to do it without that. Thanks!
ScrollView {
GeometryReader { geometry in
VStack{
ZStack(alignment: .leading) {
Text(text).foregroundColor(.clear)
.padding(14)
.font(.custom("Times", size: 14))
.background(GeometryReader {
Color.clear.preference(key: viewheightkey3.self, value: $0.frame(in: .local).size.height)
})
.frame(width: geometry.size.width * 0.9)
TextEditor(text: $text)
.padding(6)
.foregroundColor(.white)
.frame(width: geometry.size.width * 0.9)
.frame(height: height)
.frame(minHeight: 100)
.background(Color.black)
}
.padding(20)
.onPreferenceChange(viewheightkey3.self) { height = $0 }
}
}
struct viewheightkey3: PreferenceKey {
static var defaultValue: CGFloat { 0 }
static func reduce(value: inout Value, nextValue: () -> Value) {
value = value + nextValue()
}
}
推荐答案
如果你能摆脱框架宽度的东西(你可以只做一些水平填充来代替),这似乎有效:>
If you can stand to get rid of the frame width stuff (which you can probably substitute with just doing some horizontal padding), this seems to work:
struct ContentView: View {
@State private var textEditorHeight : CGFloat = 100
@State private var text = "Testing text. Hit a few returns to see what happens"
var body: some View {
ScrollView {
VStack{
Text("This should be above")
ZStack(alignment: .leading) {
Text(text)
.font(.custom("Courier", size: 24))
.foregroundColor(.clear)
.padding(14)
.background(GeometryReader {
Color.clear.preference(key: ViewHeightKey.self,
value: $0.frame(in: .local).size.height)
})
TextEditor(text: $text)
.font(.custom("Courier", size: 24))
.padding(6)
.frame(height: textEditorHeight)
.background(Color.black)
}
.padding(20)
.onPreferenceChange(ViewHeightKey.self) { textEditorHeight = $0 }
Text("This should be below the text field")
}
}
}
}
struct ViewHeightKey: PreferenceKey {
static var defaultValue: CGFloat { 0 }
static func reduce(value: inout Value, nextValue: () -> Value) {
value = value + nextValue()
}
}
我并没有真正改变你所做的任何根本性的事情.大多数情况下只是摆脱了外部 GeometryReader
并使 frame
依赖于 only 从 PreferenceKey
传入的高度>
I didn't really change anything fundamental to what you did. Mostly just got rid of the outside GeometryReader
and made the frame
dependent only on the height being passed in from the PreferenceKey
这篇关于动态文本编辑器与其他视图重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!