Ответ 1
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: Подкласс a 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;
}
Я опубликовал проект на случай, если кто-то захочет попробовать его или хочет его увидеть.
Полный "проект" доступен ЗДЕСЬ