我希望能够显示类似于控制台日志的视图,并具有可滚动和可选择的多行文本。
我想到的基本过程是维护一个字符串数组(称为lines
),并使用换行符作为分隔符,将它们附加到textStorage
的NSTextView
。
但是要考虑一些因素,例如:
textStorage
,以便它对用户无缝显示textStorage
textStorage
后保持滚动位置有人可以提供一些指导或示例来帮助我入门吗?
将数组中的字符串添加到NSTextStorage
并为NSClipView
边界原点设置动画。
- (void)appendText:(NSString*)string {
// Add a newline, if you need to
string = [NSString stringWithFormat:@"%@\n", string];
// Find range
[self.textView.textStorage replaceCharactersInRange:NSMakeRange(self.textView.textStorage.string.length, 0) withString:string];
// Get clip view
NSClipView *clipView = self.textView.enclosingScrollView.contentView;
// Calculate the y position by subtracting
// clip view height from total document height
CGFloat scrollTo = self.textView.frame.size.height - clipView.frame.size.height;
// Animate bounds
[[clipView animator] setBoundsOrigin:NSMakePoint(0, scrollTo)];
}
如果您在NSTextView
中设置了弹性,则需要监视其框架变化以获得准确的结果。将frameDidChange
侦听器添加到您的文本视图并在处理程序中设置动画:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Text view setup
[_textView setPostsFrameChangedNotifications:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollToBottom) name:NSViewFrameDidChangeNotification object:_textView];
}
- (void)scrollToBottom {
NSClipView *clipView = self.textView.enclosingScrollView.contentView;
CGFloat scrollTo = self.textView.frame.size.height - clipView.frame.size.height;
[[clipView animator] setBoundsOrigin:NSMakePoint(0, scrollTo)];
}
在现实生活中的应用程序中,您可能需要设置某种阈值,以查看用户滚动到末端的距离是否超过行的高度。