objective-c – 如何获取NSTextView的选择方向?
发布时间:2020-12-16 05:55:47 所属栏目:百科 来源:网络整理
导读:我试图在NSTextView中获取所选范围的方向.换句话说,当您使用shift leftarrow和shift rightarrow时,所选范围是否会更改其位置或长度.我的第一个虽然是selectionAffinity表示方向,但它似乎只适用于多行选择. 如何获得选定范围的方向? 解决方法 iOS版 步骤1:
我试图在NSTextView中获取所选范围的方向.换句话说,当您使用shift leftarrow和shift rightarrow时,所选范围是否会更改其位置或长度.我的第一个虽然是selectionAffinity表示方向,但它似乎只适用于多行选择.
如何获得选定范围的方向? 解决方法
iOS版
步骤1:声明属性 @property (nonatomic) NSRange lastRange; 步骤2:在TextView代理中,添加: - (void) textViewDidChangeSelection:(UITextView *)textView NSRange currentRange = NSMakeRange(textView.selectedRange.location,textView.selectedRange.length); if (currentRange.length == 0) { NSLog(@"Nothing selected"); _lastRange = currentRange; } else { if (currentRange.location < _lastRange.location) { NSLog(@"Selecting LEFT"); } else { NSLog(@"Selecting RIGHT"); } } } OSX OSX具有所需的所有功能,需要更多的工作,但这是我想出了一个工作,一致的解决方案.重命名是可选的,或者…鼓励… 第1步:将NSTextView子类化 在你的SubClass.h中: #import <Cocoa/Cocoa.h> @interface TheSelectionizer : NSTextView @property (nonatomic) NSRange lastAnchorPoint; @end 在你的SubClass.m #import "TheSelectionizer.h" - (void)setSelectedRange:(NSRange)charRange affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag { if (charRange.length == 0) { _lastAnchorPoint = charRange; } [super setSelectedRange:charRange affinity:affinity stillSelecting:stillSelectingFlag]; } @end 步骤2:实现NSTextViewDelegate - (NSRange) textView:(NSTextView *)textView willChangeSelectionFromCharacterRange:(NSRange)oldSelectedCharRange toCharacterRange:(NSRange)newSelectedCharRange { if (newSelectedCharRange.length != 0) { TheSelectionizer * selectionizer = (TheSelectionizer *)textView; int anchorStart = (int)selectionizer.lastAnchorPoint.location; int selectionStart = (int)newSelectedCharRange.location; int selectionLength = (int)newSelectedCharRange.length; /* If mouse selects left,and then a user arrows right,or the opposite,anchor point flips. */ int difference = anchorStart - selectionStart; if (difference > 0 && difference != selectionLength) { if (oldSelectedCharRange.location == newSelectedCharRange.location) { // We were selecting left via mouse,but now we are selecting to the right via arrows anchorStart = selectionStart; } else { // We were selecting right via mouse,but now we are selecting to the left via arrows anchorStart = selectionStart + selectionLength; } selectionizer.lastAnchorPoint = NSMakeRange(anchorStart,0); } // Evaluate Selection Direction if (anchorStart == selectionStart) { if (oldSelectedCharRange.length < newSelectedCharRange.length) { // Bigger NSLog(@"Will select right in overall right selection"); } else { // Smaller NSLog(@"Will select left in overall right selection"); } } else { if (oldSelectedCharRange.length < newSelectedCharRange.length) { // Bigger NSLog(@"Will select left in overall left selection"); } else { // Smaller NSLog(@"Will select right in overall left selection"); } } } return newSelectedCharRange; } 我发布了一个项目,以防有人想尝试或想要看到它. 完整的“项目”可用HERE (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |