(AppKit) NSTextBlock 内的制表符插入
(AppKit) Tab insertion inside of NSTextBlock
我正在使用 AppKit 开发适用于 macOS 的降价编辑器,并且掌握了所有基础知识并开始工作。我使用 NSTextBlock 作为代码块。
然而,我遇到的一个问题是,在 NSTextBlock 中键入制表符会导致插入符号向下移动到下一段,而不是插入制表符白色 space。期望的结果是用户能够在 NSTextBlock 中插入选项卡。
我创建了一个示例项目来演示 GitHub 上的这种行为。
快速浏览示例项目:
这是一个简单的 AppKit 应用程序。我在 Main.storyboard 中的默认 ViewController 添加了一个可编辑、可滚动的文本视图。 textView 通过 IBOutlet 连接到 ViewController class。
在自动生成的 viewDidLoad() 方法中,我调用了 insertText
函数,我编写该函数是为了将一行文本插入到 NSTextView 中,然后是两个带有 NSTextBlocks 样式的段落。
func insertText(textStorage: NSTextStorage) {
//Insert first line of regular text
var attributes: [NSAttributedString.Key: Any] = [
.font: NSFont.systemFont(ofSize: 24),
.foregroundColor: NSColor.textColor,
.backgroundColor: NSColor.clear
]
let attributedString1: NSAttributedString = NSAttributedString(string: "Test\n", attributes: attributes)
textStorage.append(attributedString1)
//Insert the blue block holdig text
attributes[.foregroundColor] = NSColor.white
attributes[.paragraphStyle] = ParagraphStyle(bgColor: NSColor.systemBlue).paragraphStyle
let attributedBlock1 = NSAttributedString(string: "Hello, I'm the blue block\n", attributes: attributes)
textStorage.append(attributedBlock1)
//Insert the pink block holdig text
attributes[.foregroundColor] = NSColor.black
attributes[.paragraphStyle] = ParagraphStyle(bgColor: NSColor.systemPink).paragraphStyle
let attributedBlock2 = NSAttributedString(string: "Hello, I'm the pink block\n", attributes: attributes)
textStorage.append(attributedBlock2)
}
效果:
如果您启动应用程序并尝试在插入符位于第一段开头时插入一个制表符,则会按预期将制表符白色space 添加到该段落的开头。但是,如果您尝试对使用 NSTextBlocks 设置样式的段落执行相同的操作,插入符号只会向下移动到下一段,并且不会插入 Tab whitespace。
我为示例项目编写的另外两个 class 是 ParagraphStyle 和 CustomTextBlock。
对于ParagraphStyle
class,持有用于蓝色和粉红色块属性的段落样式:
class ParagraphStyle {
let bgColor: NSColor
let paragraphStyle: NSParagraphStyle
init(bgColor: NSColor) {
self.bgColor = bgColor
//Set paragraph style
self.paragraphStyle = {
let mutableParagraphStyle = NSMutableParagraphStyle()
let specialBlock = CustomTextBlock(bgColor: bgColor)
mutableParagraphStyle.textBlocks.append(specialBlock)
let style = mutableParagraphStyle as NSParagraphStyle
return style
}()
}}
对于CustomTextBlock
class,继承自NSTextBlock
,我定义块的颜色和尺寸:
class CustomTextBlock: NSTextBlock {
init(bgColor: NSColor) {
super.init()
//Control the BG color of the text block
self.backgroundColor = bgColor
//Control dimensions of the text block
self.setValue(100, type: NSTextBlock.ValueType.percentageValueType, for: NSTextBlock.Dimension.width)
self.setValue(50, type: NSTextBlock.ValueType.absoluteValueType, for: NSTextBlock.Dimension.minimumHeight)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}}
我试过的
- 在初始化
ParagraphStyle
的 paragraphStyle 属性 值时添加 NSTextTabs to the .tabStops 数组 class。
- 通过 addTabStop 方法添加 NSTextTab。
- 正在将值设置为 defaultTabInterval
- 将 textView 的
nextKeyView
和 nextResponder
设置为 nil。
唯一剩下的(我能想到的)就是当 textview 是第一响应者时监听用户按下 tab 键。当事件发生时,我会以编程方式将 Tab white space 插入用户插入符号所在的位置,然后以编程方式将插入符号移回应有的位置。然而,这是解决这个看似简单的问题的一种极其迂回的方法,这就是为什么我认为我可能遗漏了一些明显的东西。希望这里更有经验的开发者能有其他的建议!
提前致谢!
显然,文本块中的制表符会将插入点移动到下一个文本块,这在 table 中是有意义的。解决方法:子类 NSTextView
,覆盖 insertTab
并插入一个制表符。
override func insertTab(_ sender: Any?) {
insertText("\t", replacementRange: selectedRange())
}
我正在使用 AppKit 开发适用于 macOS 的降价编辑器,并且掌握了所有基础知识并开始工作。我使用 NSTextBlock 作为代码块。
然而,我遇到的一个问题是,在 NSTextBlock 中键入制表符会导致插入符号向下移动到下一段,而不是插入制表符白色 space。期望的结果是用户能够在 NSTextBlock 中插入选项卡。
我创建了一个示例项目来演示 GitHub 上的这种行为。
快速浏览示例项目:
这是一个简单的 AppKit 应用程序。我在 Main.storyboard 中的默认 ViewController 添加了一个可编辑、可滚动的文本视图。 textView 通过 IBOutlet 连接到 ViewController class。
在自动生成的 viewDidLoad() 方法中,我调用了 insertText
函数,我编写该函数是为了将一行文本插入到 NSTextView 中,然后是两个带有 NSTextBlocks 样式的段落。
func insertText(textStorage: NSTextStorage) {
//Insert first line of regular text
var attributes: [NSAttributedString.Key: Any] = [
.font: NSFont.systemFont(ofSize: 24),
.foregroundColor: NSColor.textColor,
.backgroundColor: NSColor.clear
]
let attributedString1: NSAttributedString = NSAttributedString(string: "Test\n", attributes: attributes)
textStorage.append(attributedString1)
//Insert the blue block holdig text
attributes[.foregroundColor] = NSColor.white
attributes[.paragraphStyle] = ParagraphStyle(bgColor: NSColor.systemBlue).paragraphStyle
let attributedBlock1 = NSAttributedString(string: "Hello, I'm the blue block\n", attributes: attributes)
textStorage.append(attributedBlock1)
//Insert the pink block holdig text
attributes[.foregroundColor] = NSColor.black
attributes[.paragraphStyle] = ParagraphStyle(bgColor: NSColor.systemPink).paragraphStyle
let attributedBlock2 = NSAttributedString(string: "Hello, I'm the pink block\n", attributes: attributes)
textStorage.append(attributedBlock2)
}
效果:
如果您启动应用程序并尝试在插入符位于第一段开头时插入一个制表符,则会按预期将制表符白色space 添加到该段落的开头。但是,如果您尝试对使用 NSTextBlocks 设置样式的段落执行相同的操作,插入符号只会向下移动到下一段,并且不会插入 Tab whitespace。
我为示例项目编写的另外两个 class 是 ParagraphStyle 和 CustomTextBlock。
对于ParagraphStyle
class,持有用于蓝色和粉红色块属性的段落样式:
class ParagraphStyle {
let bgColor: NSColor
let paragraphStyle: NSParagraphStyle
init(bgColor: NSColor) {
self.bgColor = bgColor
//Set paragraph style
self.paragraphStyle = {
let mutableParagraphStyle = NSMutableParagraphStyle()
let specialBlock = CustomTextBlock(bgColor: bgColor)
mutableParagraphStyle.textBlocks.append(specialBlock)
let style = mutableParagraphStyle as NSParagraphStyle
return style
}()
}}
对于CustomTextBlock
class,继承自NSTextBlock
,我定义块的颜色和尺寸:
class CustomTextBlock: NSTextBlock {
init(bgColor: NSColor) {
super.init()
//Control the BG color of the text block
self.backgroundColor = bgColor
//Control dimensions of the text block
self.setValue(100, type: NSTextBlock.ValueType.percentageValueType, for: NSTextBlock.Dimension.width)
self.setValue(50, type: NSTextBlock.ValueType.absoluteValueType, for: NSTextBlock.Dimension.minimumHeight)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}}
我试过的
- 在初始化
ParagraphStyle
的 paragraphStyle 属性 值时添加 NSTextTabs to the .tabStops 数组 class。 - 通过 addTabStop 方法添加 NSTextTab。
- 正在将值设置为 defaultTabInterval
- 将 textView 的
nextKeyView
和nextResponder
设置为 nil。
唯一剩下的(我能想到的)就是当 textview 是第一响应者时监听用户按下 tab 键。当事件发生时,我会以编程方式将 Tab white space 插入用户插入符号所在的位置,然后以编程方式将插入符号移回应有的位置。然而,这是解决这个看似简单的问题的一种极其迂回的方法,这就是为什么我认为我可能遗漏了一些明显的东西。希望这里更有经验的开发者能有其他的建议!
提前致谢!
显然,文本块中的制表符会将插入点移动到下一个文本块,这在 table 中是有意义的。解决方法:子类 NSTextView
,覆盖 insertTab
并插入一个制表符。
override func insertTab(_ sender: Any?) {
insertText("\t", replacementRange: selectedRange())
}