我正在嘗試制作一個帶有 Divider 的 SwiftUI TextEditor,該分隔器可以調整其位置以保持在應用程式的 edit-bio 部分內最底部的文本行下方。
注意:我的 TextEditor 上有一個框架,這樣它就不會占據整個螢屏
現在分頻器是靜態的并且停留在一個地方。是否有一種內置方法可以使分隔符保持在最底部的文本行下方?
我會認為 Spacer 會給我這種行為?
謝謝!

struct EditBio: View {
@ObservedObject var editProfileVM: EditProfileViewModel
var body: some View {
VStack(spacing: 10) {
TextEditor(text: $editProfileVM.bio)
.foregroundColor(.white)
.padding(.top, 70)
.padding([.leading, .trailing], 50)
.frame(minWidth: 100, idealWidth: 200, maxWidth: 400, maxHeight: 200, alignment: .center)
Divider().frame(height: 1).background(.white)
Spacer()
}
}
}
uj5u.com熱心網友回復:
它正在做你告訴它做的事情。但是您的TextEditor. 您會看到它的高度為 200 與VStack.
我更改了您的代碼以使其顯而易見:
struct EditBio: View {
@State var editProfileVM = ""
var body: some View {
VStack(spacing: 10) {
TextEditor(text: $editProfileVM)
.foregroundColor(.white)
.padding(.top, 70)
.padding([.leading, .trailing], 50)
.frame(minWidth: 100, idealWidth: 200, maxWidth: 400, maxHeight: 200, alignment: .center)
.background(Color.gray)
Divider().frame(height: 1).background(.red)
Spacer()
}
}
}
產生這個:

您可以看到TextEditor自然希望高于 200,但這已限制了它。因此,Spacer()不會導致TextEditor更小。
設定固定框架導致的另一個問題是您的文本最終會在某些時候離開螢屏。我假設您真正想要的是不大TextEditor于其內容的自定尺寸。
這可以通過以下代碼簡單地完成:
struct EditBio: View {
@State var editProfileVM = ""
var body: some View {
VStack(spacing: 10) {
SelfSizingTextEditor(text: $editProfileVM)
// Frame removed for the image below.
// .frame(minWidth: 100, idealWidth: 200, maxWidth: 400, maxHeight: 200, alignment: .center)
.foregroundColor(.white)
// made the .top padding to be .vertical
.padding(.vertical, 70)
.padding([.leading, .trailing], 50)
.background(Color.gray)
Divider().frame(height: 5).background(.red)
Spacer()
}
}
}
struct SelfSizingTextEditor: View {
@Binding var text: String
@State var textEditorSize = CGSize.zero
var body: some View {
ZStack {
Text(text)
.foregroundColor(.clear)
.copySize(to: $textEditorSize)
TextEditor(text: $text)
.frame(height: textEditorSize.height)
}
}
}
extension View {
func readSize(onChange: @escaping (CGSize) -> Void) -> some View {
background(
GeometryReader { geometryProxy in
Color.clear
.preference(key: SizePreferenceKey.self, value: geometryProxy.size)
}
)
.onPreferenceChange(SizePreferenceKey.self, perform: onChange)
}
func copySize(to binding: Binding<CGSize>) -> some View {
self.readSize { size in
binding.wrappedValue = size
}
}
}
產生這個視圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/439961.html
