【问题标题】:NSTextView auto-scrollNSTextView 自动滚动
【发布时间】:2014-12-26 01:06:10
【问题描述】:

假设有一个带有NSTextView 的窗口,其中包含足够的文本来触发滚动条。当我调整窗口大小时,文本视图会自动滚动,以便包含光标的行出现在文本视图的中间。

例如,这也可以在 MacOS 的 TextEdit 中看到:在其中粘贴一堆文本,几乎滚动到顶部 [1],将光标放在第一个可见行并调整窗口大小。现在视图应该滚动它的内容,使光标落在视图的中间。

我的问题是,如何关闭这种行为?也就是说,我希望文本视图在调整窗口大小时永远不会自动将光标滚动到中间..?

[1] 发生上述行为的实际滚动位置可能需要反复试验,因为我无法找到发生这种情况的模式。在我的测试中,当滚动条位于总高度的 10% - 30% 位置(从顶部开始)时,就会发生这种情况。

【问题讨论】:

  • 你想让你的文本视图可编辑吗??
  • @HussainShabbir 是的。
  • @Eric 参考下面的答案

标签: objective-c cocoa nstextview appkit nsscrollview


【解决方案1】:

您可以像下面这样进行调整:-

创建NSTextView 的自定义类并实现一种用于调整textview 大小的委托方法和一种单击textview 时的方法。参考如下:-

.h 文件

@interface textView : NSTextView
@end

.m 文件

#import "textView.h"

@implementation textView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // Drawing code here.
}
//Below delegate method which will call when resize the textview. So just set your text view to be non editable.
- (void)viewDidEndLiveResize
{
    [self setEditable:NO];
    [self setSelectable:NO];
}

//Now when you click on the textview below method will called.
-(void)mouseDown:(NSEvent*) theEvent
{
    [super mouseDown:theEvent];
    [self setEditable:YES];
    [self setSelectable:YES];
}

-(void)keyDown:(NSEvent *)theEvent
{
    [super keyDown:theEvent];
    [self setEditable:YES];
    [self setSelectable:YES];
}

@end

编辑:- 另外,在textview -> Custom Class

中的接口生成器中提及自定义类名

【讨论】:

  • 非常感谢您的回复,但恐怕除非我遗漏了什么,否则这不会飞:现在文本甚至没有重排,并且 textview 失去焦点和光标位置。为什么setEditable:NOdrawRect: 在做什么?换句话说,我对NSTextView 的工作方式非常满意,除了调整大小后的自动滚动。
  • 基本上这是 text view 的默认行为。但是如果你想停止自动滚动,那么你需要像这样执行调整。当你点击你想要的任何一行时,焦点就会出现。
  • 当然可以,但是上面的调整不起作用。例如,如果我不点击而是使用键盘会怎样?也就是说,我真的很感谢你调查了这个,只是我不认为这个特殊的技巧会做到这一点。
  • 在这种情况下,您只需实现 keyDown 方法。这样每当您单击键盘 keydown 方法时就会触发,您的焦点将再次回到您的 textview 上。请参阅更新后的答案。
猜你喜欢
  • 2020-02-14
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多