鼠标悬停在NSCollectionView+NSScrollView中



在一个10.7以上的项目中,当鼠标位于集合视图项的视图范围内时,我试图在NSCollectionViewItem中启用UI元素。对于填充NSCollectionView的每个集合视图项,我都有一个自定义视图,它使用其边界创建了一个单独的NSTrackingArea:

- (void) initializeMouseTracking
{
    self.trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways owner:self userInfo:nil];
    [self addTrackingArea:self.trackingArea];
    NSPoint mouseLocation = [[self window] mouseLocationOutsideOfEventStream];
    mouseLocation = [self convertPoint: mouseLocation fromView: nil];
    if (NSPointInRect(mouseLocation, [self bounds]) == YES)
    {
        [self mouseEntered:nil];
    }
    else
    {
        [self mouseExited:nil];
    }
}

在滚动NSCollectionView内容之前,跟踪区域工作良好。很明显,在滚动期间和之后需要重置跟踪区域。我试图通过以下几种方式使NSTrackingArea无效并重新创建:

- (void) resetMouseTracking
{
    [self removeTrackingArea:self.trackingArea];
    [self initializeMouseTracking];
}

- (void) scrollWheel:(NSEvent *)theEvent
{
    [self resetMouseTracking];
    [super scrollWheel:theEvent];
}

- (void) viewDidMoveToWindow:(NSWindow *)newWindow
{   
    [self resetMouseTracking];
    [super viewWillMoveToWindow:newWindow];
}

- (void) updateTrackingAreas
{
    [self resetMouseTracking];
    [super updateTrackingAreas];
}

但这些尝试不仅有不完整和错误的结果,而且在滚动过程中不断重新计算跟踪区域(ala scrollwheel:)似乎没有必要。相反,有一种有效的方法来捕捉滚动事件的开始和偏移(在iOS中很容易做到)会很有用,这样我就可以在滚动过程中使所有跟踪区域无效。在scrollview的contentView上使用NSViewBoundsIdChangeNotification会告诉我滚动正在发生,但它不会指示滚动何时开始或停止。

从NSScrollView获取滚动开始和结束通知需要深入的子类化吗?或者我忽略了其他什么?是否有一种完全不同的方法显示出更多的前景?

在Cocoa中,滚动视图不同于iOS,所有操作都在documentView上完成(与contentView相反)。您可能需要[scrollView documentVisibleRect].origin作为内容偏移量。

请查看此答案,以了解UIScrollView和NSScrollView 的更多类似比较

一种不同的方法。。。NSView继承自NSResponder类。NSResponder具有方法"mouseEntered:"one_answers"mouseExited:"。我的建议是,如果可能的话,在NSView子类中使用这些,并跳过跟踪区域。

相关内容

  • 没有找到相关文章

最新更新