Bre*_*mbs 3 textview ios swift swiftui uiviewrepresentable
I\xe2\x80\x99m 取决于使用此处创建的 UIViewRepresentable 的 TextView https://www.appcoda.com/swiftui-textview-uiviewrepresentable/。
\nstruct TextView: UIViewRepresentable {\n \n @Binding var text: String\n @Binding var textStyle: UIFont.TextStyle\n \n func makeUIView(context: Context) -> UITextView {\n let textView = UITextView()\n \n textView.delegate = context.coordinator\n textView.font = UIFont.preferredFont(forTextStyle: textStyle)\n textView.autocapitalizationType = .sentences\n textView.isSelectable = true\n textView.isUserInteractionEnabled = true\n \n return textView\n }\n \n func updateUIView(_ uiView: UITextView, context: Context) {\n uiView.text = text\n uiView.font = UIFont.preferredFont(forTextStyle: textStyle)\n }\n \n func makeCoordinator() -> Coordinator {\n Coordinator($text)\n }\n \n class Coordinator: NSObject, UITextViewDelegate {\n var text: Binding<String>\n\n init(_ text: Binding<String>) {\n self.text = text\n }\n \n func textViewDidChange(_ textView: UITextView) {\n self.text.wrappedValue = textView.text\n }\n }\n}\n\nstruct ContentView: View {\n \n @State private var message = ""\n @State private var textStyle = UIFont.TextStyle.body\n \n var body: some View {\n ZStack(alignment: .topTrailing) {\n TextView(text: $message, textStyle: $textStyle)\n .padding(.horizontal)\n \n Button(action: {\n self.textStyle = (self.textStyle == .body) ? .title1 : .body\n }) {\n Image(systemName: "textformat")\n .imageScale(.large)\n .frame(width: 40, height: 40)\n .foregroundColor(.white)\n .background(Color.purple)\n .clipShape(Circle())\n \n }\n .padding() \n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nI\xe2\x80\x99m 遇到的问题是每当我在最后一行之前开始换行 1) + 2) 在该行的最后一个字符之后,光标总是跳到文本中的最后一个字符之后。有任何想法吗?
\n更新:
\nLeo\xe2\x80\x99s 响应从技术上解决了这个问题,但 \xe2\x80\x99s 似乎并不完美,因为 \xe2\x80\x99s 出现了不需要的滚动行为,尽管插入符位置现在是正确的,但 \xe2\x80\ x99t 停止自动滚动到底部。见下文:
\n\n在 updateUIView 方法中设置 text 属性后,您可以保存插入符号位置 (selectedRange) 并设置文本视图选定范围:
func updateUIView(_ uiView: UITextView, context: Context) {
let selectedRange = uiView.selectedRange
uiView.text = text
uiView.font = .preferredFont(forTextStyle: textStyle)
uiView.selectedRange = selectedRange
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1766 次 |
| 最近记录: |