在 macOS-SwiftUI 中禁用 TextEditor 的选择光标
Disable selection cursor for TextEditor in macOS-SwiftUI
我可以使用以下代码禁用对 TextEditor 的选择和编辑:
TextEditor(text: self.$content)
.allowsHitTesting(false)
.disabled(true)
但是当我的光标悬停在其中时,这不会影响我的光标,这正是我想要的。有没有办法在禁用时将主光标保留在 TextEditor 中,而不是选择光标?
我想要这个,因为我在 TextEditor 上方的 ZStack 中的其他视图始终有这个选择光标,这很烦人。
您可以像这样使用 overlay
修饰符:
struct ContentView: View {
@State private var string: String = "Hello, World!"
@State private var disableStringSelection: Bool = Bool()
var body: some View {
VStack(spacing: 5.0) {
Color.white
.overlay(disableStringSelection ? Text(string).font(Font.body).padding(.leading, 5.0) : nil, alignment: .topLeading)
.overlay(disableStringSelection ? nil : TextEditor(text: $string).font(Font.body))
.cornerRadius(10.0)
Button(disableStringSelection ? "Enable Selection" : "Disable Selection") { disableStringSelection.toggle() }
}
.padding(5.0)
}
}
更新:
新的更新也将支持深色模式:
struct ContentView: View {
@State private var string: String = "Hello, World!"
@State private var disableStringSelection: Bool = Bool()
var body: some View {
VStack(spacing: 5.0) {
Color(NSColor.textBackgroundColor)
.overlay(disableStringSelection ? Text(string).font(Font.body).padding(.leading, 5.0) : nil, alignment: .topLeading)
.overlay(disableStringSelection ? nil : TextEditor(text: $string).font(Font.body))
.animation(nil)
.cornerRadius(10.0)
.foregroundColor(Color(NSColor.labelColor))
.frame(width: 400.0, height: 200.0, alignment: .center)
Button(disableStringSelection ? "Enable Selection" : "Disable Selection") { disableStringSelection.toggle() }
.foregroundColor(Color(NSColor.labelColor))
}
.padding(5.0)
}
}
extension NSTextView {
open override var frame: CGRect {
didSet { backgroundColor = NSColor.clear }
}
}
我可以使用以下代码禁用对 TextEditor 的选择和编辑:
TextEditor(text: self.$content)
.allowsHitTesting(false)
.disabled(true)
但是当我的光标悬停在其中时,这不会影响我的光标,这正是我想要的。有没有办法在禁用时将主光标保留在 TextEditor 中,而不是选择光标?
我想要这个,因为我在 TextEditor 上方的 ZStack 中的其他视图始终有这个选择光标,这很烦人。
您可以像这样使用 overlay
修饰符:
struct ContentView: View {
@State private var string: String = "Hello, World!"
@State private var disableStringSelection: Bool = Bool()
var body: some View {
VStack(spacing: 5.0) {
Color.white
.overlay(disableStringSelection ? Text(string).font(Font.body).padding(.leading, 5.0) : nil, alignment: .topLeading)
.overlay(disableStringSelection ? nil : TextEditor(text: $string).font(Font.body))
.cornerRadius(10.0)
Button(disableStringSelection ? "Enable Selection" : "Disable Selection") { disableStringSelection.toggle() }
}
.padding(5.0)
}
}
更新:
新的更新也将支持深色模式:
struct ContentView: View {
@State private var string: String = "Hello, World!"
@State private var disableStringSelection: Bool = Bool()
var body: some View {
VStack(spacing: 5.0) {
Color(NSColor.textBackgroundColor)
.overlay(disableStringSelection ? Text(string).font(Font.body).padding(.leading, 5.0) : nil, alignment: .topLeading)
.overlay(disableStringSelection ? nil : TextEditor(text: $string).font(Font.body))
.animation(nil)
.cornerRadius(10.0)
.foregroundColor(Color(NSColor.labelColor))
.frame(width: 400.0, height: 200.0, alignment: .center)
Button(disableStringSelection ? "Enable Selection" : "Disable Selection") { disableStringSelection.toggle() }
.foregroundColor(Color(NSColor.labelColor))
}
.padding(5.0)
}
}
extension NSTextView {
open override var frame: CGRect {
didSet { backgroundColor = NSColor.clear }
}
}