2011-03-01 43 views
3

所以我想要得到NSPoint或NSRect對應於NSTextView中特定字符的位置。這是我到目前爲止(不工作得很好,結果似乎有種不可預測的。NSPoint/NSRect來自NSTextView中的字符

NSRange theTextRange = [[theTextView layoutManager] glyphRangeForCharacterRange:[theTextStorage editedRange] actualCharacterRange:NULL]; 
NSRect theTextRect = [[theTextView layoutManager] boundingRectForGlyphRange:theTextRange inTextContainer:[theTextView textContainer]]; 

回答

6

通過boundingRectForGlyphRange:inTextContainer:返回的矩形是在容器的座標。你需要的,如果你想調整這個獲得相對RECT到文本視圖:

NSRange theTextRange = [[textView layoutManager] glyphRangeForCharacterRange:textRange actualCharacterRange:NULL]; 
NSRect layoutRect = [[textView layoutManager] boundingRectForGlyphRange:theTextRange inTextContainer:[textView textContainer]]; 
NSPoint containerOrigin = [textView textContainerOrigin]; 
layoutRect.origin.x += containerOrigin.x; 
layoutRect.origin.y += containerOrigin.y; 
0

您可以通過NSPoint &使用鼠標按下事件的NSRect

#import <Cocoa/Cocoa.h> 

@interface ClickTextView : NSView { 
    NSMutableArray *texts; 
    NSPoint currentLocation; 
    NSCell *cell; 
} 

@end 

#import "ClickTextView.h" 
@interface TextClip : NSObject 
{ 

@public 
    NSString *text; 
    NSPoint location; 
} 

@end 

@implementation TextClip @end 


@implementation ClickTextView 
- (void)awakeFromNib 
{ 
    texts = [NSMutableArray new]; 
    cell = [[NSTextFieldCell alloc] initTextCell: @""]; 
    [cell setEditable: YES]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    NSRect frame = rect; 
    [[NSColor whiteColor] set]; 
    [NSBezierPath fillRect: rect]; 
    for (TextClip *clip in texts) 
    { 
     [cell setStringValue: clip->text]; 
     frame.origin = clip->location; 
     [cell drawWithFrame: frame inView: self]; 
    } 
} 

- (void)mouseDown: (NSEvent*)theEvent 
{ 
    currentLocation = [self convertPoint: [theEvent locationInWindow] 
           fromView: nil]; 
    NSText *fieldEditor = [[self window] fieldEditor: YES 
              forObject: self]; 
    [cell endEditing: fieldEditor]; 
    [fieldEditor setString: @""]; 
    [cell setStringValue: @""]; 
    NSRect frame = {currentLocation, {400, 400}}; 
    [cell editWithFrame: frame 
       inView: self 
       editor: fieldEditor 
       delegate: self 
        event: theEvent]; 
} 
- (BOOL)isFlipped 
{ 
    return YES; 
} 
- (void)textDidEndEditing: (NSNotification*)aNotification 
{ 
    NSText *text = [aNotification object]; 
    TextClip *clip = [[TextClip alloc] init]; 
    clip->text = [[text string] copy]; 
    clip->location = currentLocation; 
    [texts addObject: clip]; 
    [cell endEditing: text]; 
    [self setNeedsDisplay: YES]; 
} 
@end