2013-03-16 73 views
2

我一直在这个工作了几个小时,不知道出了什么问题。我想要一个NSTextView子视图的按钮的自定义光标,我添加一个跟踪区域,并在鼠标进入按钮时发送cursorUpdate消息。cursorUpdate调用,但光标未更新

每次鼠标进入跟踪区域时,都会调用cursorUpdate方法。但光标保持IBeamCursor。

任何想法?

参考苹果文档的:managing cursor-update event

- (void)cursorUpdate:(NSEvent *)event { 
    [[NSCursor arrowCursor] set]; 
} 

- (void)myAddTrackingArea { 
    [self myRemoveTrackingArea]; 

    NSTrackingAreaOptions trackingOptions = NSTrackingCursorUpdate | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow; 
    _trackingArea = [[NSTrackingArea alloc] initWithRect: [self bounds] options: trackingOptions owner: self userInfo: nil]; 
    [self addTrackingArea: _trackingArea]; 
} 

- (void)myRemoveTrackingArea { 
    if (_trackingArea) 
    { 
     [self removeTrackingArea: _trackingArea]; 
     _trackingArea = nil; 
    } 
} 
+0

你把这段代码放在哪一类? – 2013-03-16 17:43:32

回答

3

我遇到了同样的问题。

问题是,NSTextView每次收到mouseMoved:事件时都会更新其光标。该事件由NSTextView的自我更新NSTrackingArea触发,该自我更新始终跟踪NSScrollViewNSTextView的可见部分。所以我可以想到两种解决方案。

  1. 覆盖updateTrackingAreas删除由可可提供的跟踪区域,并确保您始终创建,而不是一个新的排除按钮。 (我不会这样做!)

  2. 覆盖mouseMoved:并确保在光标位于按钮上方时它不会调用super。

    - (void)mouseMoved:(NSEvent *)theEvent { 
        NSPoint windowPt = [theEvent locationInWindow]; 
        NSPoint superViewPt = [[self superview] 
          convertPoint: windowPt fromView: nil]; 
        if ([self hitTest: superViewPt] == self) { 
         [super mouseMoved:theEvent]; 
        } 
    } 
    
0

我只是碰到这种跑通过谷歌搜索,所以我想我会发布我的解决方案。

  1. NSTextView/NSTextField的子类。
  2. 请按照文档to create an NSTrackingArea中的步骤操作。应该看起来像下面这样。把这个代码在子类中的init方法(也添加updateTrackingAreas法):

    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:(NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil]; 
    [self addTrackingArea:trackingArea]; 
    self.trackingArea = trackingArea; 
    
  3. 现在你需要的mouseMoved:方法添加到子类:

    - (void)mouseMoved:(NSEvent *)theEvent { 
        NSPoint point = [self convertPoint:theEvent.locationInWindow fromView:nil]; 
        if (NSPointInRect(point, self.popUpButton.frame)) { 
         [[NSCursor arrowCursor] set]; 
        } else { 
         [[NSCursor IBeamCursor] set]; 
        } 
    } 
    

注:self.popUpButton是NSTextView/NSTextField子视图的按钮。

就是这样!不是很难结束 - 只需要使用mouseMoved:而不是cursorUpdate:。花了我几个小时才弄明白,希望有人可以使用它。