raf*_*nes 1 uitextview ios swiftui
我正在使用UIViewRepresentable
包装器来创建一个可绑定的多行,UITextVIew
因为原生 SwiftUI仍然没有多行支持TextField
。只要isScrollEnabled = true
在 UITextView 上设置,一切都可以正常工作。
有没有办法让文本在不UITextView
滚动的情况下换行?
import SwiftUI
struct TextfieldIssue: View {
@State var text: String = "Hello, I am some long text that will wrap if isScrollEnabled is set to true, but not if isScrollEnabled is set to false"
var body: some View {
MultilineTextField(text: $text)
}
}
struct MultilineTextField: UIViewRepresentable {
private let view = UITextView()
@Binding var text: String
func makeUIView(context: UIViewRepresentableContext<MultilineTextField>) -> UITextView {
view.isEditable = true
view.font = UIFont.systemFont(ofSize: 24)
// Text wraps fine as long as this is true
view.isScrollEnabled = true
// Text does not wrap if this is uncommented
// view.isScrollEnabled = false
view.text = text
view.delegate = context.coordinator
return view
}
func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<MultilineTextField>) {
uiView.text = text
}
func makeCoordinator() -> TextFieldCoordinator {
let coordinator = TextFieldCoordinator(self)
self.view.delegate = coordinator
return coordinator
}
}
class TextFieldCoordinator : NSObject, UITextViewDelegate {
var parent: MultilineTextField
init(_ multilineTextField: MultilineTextField) {
self.parent = multilineTextField
}
func textViewDidChange(_ textView: UITextView) {
self.parent.text = textView.text
}
}
struct TextfieldIssue_Previews: PreviewProvider {
static var previews: some View {
TextfieldIssue()
}
}
Run Code Online (Sandbox Code Playgroud)
只需将此添加到makeUIView
文本将换行。
view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Run Code Online (Sandbox Code Playgroud)
这是完整的更新makeUIView
功能:
view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
768 次 |
最近记录: |