标签: nstrackingarea

鼠标在滚动时离开trackingArea时不会调用mouseExited

为什么当鼠标通过滚动或动画从NStrackingArea退出时,不会调用mouseExited/mouseEntered?

我创建这样的代码:

鼠标进入和退出:

-(void)mouseEntered:(NSEvent *)theEvent {
    NSLog(@"Mouse entered");
}

-(void)mouseExited:(NSEvent *)theEvent
{
    NSLog(@"Mouse exited");
}
Run Code Online (Sandbox Code Playgroud)

跟踪区域:

-(void)updateTrackingAreas
{ 
    if(trackingArea != nil) {
        [self removeTrackingArea:trackingArea];
        [trackingArea release];
    }

    int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways);
    trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds]
                                             options:opts
                                               owner:self
                                            userInfo:nil];
    [self addTrackingArea:trackingArea];
}
Run Code Online (Sandbox Code Playgroud)

更多细节:

我在NSScrollView的视图中添加了NSView作为子视图.每个NSView都有自己的跟踪区域,当我滚动我的scrollView并离开跟踪区域"mouseExited"时没有调用但没有滚动一切正常.问题是,当我滚动"updateTrackingAreas"被调用时,我认为这会产生问题.

*仅使用NSView同样的问题而不将其添加为子视图,因此这不是问题.

macos cocoa objective-c nstrackingarea

29
推荐指数
1
解决办法
6917
查看次数

我可以从非活动应用程序更改当前光标吗?

我有一个在后台运行的实用程序Mac应用程序(LSUIElement启用).在某些情况下,此应用程序显示带有几个按钮的菜单窗口.问题是,当我将鼠标悬停在此窗口上时,鼠标光标仍然会根据其下方的应用程序运行 - 当菜单下有文本时,光标会变为插入"I beam"形状.

显然我更喜欢常规指针箭头.我NSTrackingArea经过一些黑客攻击后潜入了朋友,我可以检测到鼠标输入和鼠标退出事件.但是当我尝试使用NSCursor鼠标输入更改当前光标时,没有任何反应.看起来机器拒绝从非活动应用程序更改游标,因为当我在鼠标输入事件之前激活应用程序时,光标会改变.

我不想仅仅为了更改光标而切换活动应用程序.有没有办法摆脱非活动应用程序的光标?

PS cocoa-dev上的同样问题:,.

macos cocoa mouse-cursor nscursor nstrackingarea

10
推荐指数
1
解决办法
554
查看次数

如何实现NSTrackingArea的mouseEntered /退出动画?

我想实现一个功能,当用户将鼠标悬停在特定区域上时,新视图将显示为类似抽屉的动画.而且,当用户离开特定区域时,抽屉应该消失动画.这正是您在OS X中悬停在屏幕底部时看到的内容,其中Dock出现并随动画消失.

但是,如果我使用动画实现该功能,则在完成动画之前重新进入特定区域时,它将无法正常工作mouseExited:.这是我的代码:

let trackingArea = NSTrackingArea(rect: CGRectMake(0, 0, 120, 300), options: NSTrackingAreaOptions.ActiveAlways | NSTrackingAreaOptions.MouseEnteredAndExited, owner: self, userInfo: nil)
underView.addTrackingArea(trackingArea) // underView is the dummy view just to respond to the mouse tracking, since the drawerView's frame is changed during the animation; not sure if this is the clean way...

override func mouseEntered(theEvent: NSEvent) {
    let frameAfterVisible = CGRectMake(0, 0, 120, 300)
    NSAnimationContext.runAnimationGroup({
        (context: NSAnimationContext!) in
            context.duration = 0.6
            self.drawerView.animator().frame = frameAfterVisible
        }, completionHandler: { () …
Run Code Online (Sandbox Code Playgroud)

cocoa nstrackingarea nsanimation swift

8
推荐指数
2
解决办法
5076
查看次数

将光标设置为指向文本视图的手

有没有办法在不继承 NSTextView 的情况下将光标设置为指向文本视图的指针?

我阅读了很多关于 NSTrackingAreas 的内容,测试了很多示例,设置了不同的跟踪选项并实现了不同的方法,但光标仍然是 I-Beam。我已经读到它是 AppKit 自动功能,那么我该如何防止这种情况发生?

谢谢!

cursor nstextview nstrackingarea

5
推荐指数
1
解决办法
2439
查看次数

无法更改NSTextField的鼠标光标

我正在尝试更改NSTextField从NIB加载的窗口表中的a 的鼠标光标.

在文档之后,我已经进行了子类化NSTextField和实现resetCursorRects.

- (void) resetCursorRects {
    [self addCursorRect:[self bounds] cursor:[NSCursor pointingHandCursor]];
}
Run Code Online (Sandbox Code Playgroud)

从未调用过.在以下内容中添加以下内容后甚至没有NSWindowViewController:

- (void) windowDidLoad {
    [self.window invalidateCursorRectsForView:self.linkTextField];
}
Run Code Online (Sandbox Code Playgroud)

我还尝试通过在NSTextField子类中添加以下内容来跟踪区域:

- (void) awakeFromNib {
    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds
                                                 options:(NSTrackingCursorUpdate | NSTrackingActiveAlways)
                                                   owner:self
                                                userInfo:nil];
    [self addTrackingArea:trackingArea];
}

- (void)cursorUpdate:(NSEvent *)theEvent {
    [[NSCursor pointingHandCursor] set];
}
Run Code Online (Sandbox Code Playgroud)

也没用.我究竟做错了什么?

macos cocoa nstextfield nscursor nstrackingarea

4
推荐指数
2
解决办法
3968
查看次数

无法启动NSTrackingArea

NSOutlineView想在拖放过程中拥有mouseEntered:mouseExited:更新它。因此,我尝试在其中添加一个NSTrackingArea。在我的大纲视图子类中,我有:

let target = self.frame
let options = [NSTrackingAreaOptions.enabledDuringMouseDrag]
let area = NSTrackingArea(rect: target, options: options, owner: self, userInfo: nil)
self.addTrackingArea(area)
Run Code Online (Sandbox Code Playgroud)

但是我似乎得到了运行时异常:

[General] trackingArea options 0x400 do not include a type
Run Code Online (Sandbox Code Playgroud)

这一定是很明显的,但是Google的所有搜索结果似乎都不能说明我做错了什么。如果我做:

var trackingID = self.addTrackingRect(target, owner: self, userData: nil, assumeInside: false)
Run Code Online (Sandbox Code Playgroud)

那么鼠标方法会触发,但显然只有在释放鼠标按钮时才会触发。

cocoa nstrackingarea swift

3
推荐指数
1
解决办法
551
查看次数

当光标悬停在NSTextView内的NSButton时,如何强制光标成为"arrowCursor"?

好的,问题是:
我有一个NSTextView,我添加自定义NSButton使用:

[_textView addSubview:button];
Run Code Online (Sandbox Code Playgroud)

然后,在我的NSButton子类中,我(以及NSTrackingArea东西):

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

- (void)mouseExited:(NSEvent *)theEvent{
     [[NSCursor arrowCursor] set];
}

- (void)mouseDown:(NSEvent *)theEvent{
     [[NSCursor arrowCursor] set];
}

- (void)mouseUp:(NSEvent *)theEvent{
     [[NSCursor arrowCursor] set];
}
Run Code Online (Sandbox Code Playgroud)

但是当我悬停它时,光标保持不变IBeamCursor(因为它是a NSTextView).只有当我按下按钮时,光标才会更新.然后,当我移动鼠标时,仍然在按钮内,光标返回到IBeamCursor.

关于如何做到这一点的任何想法?谢谢!

cocoa objective-c nsbutton nscursor nstrackingarea

3
推荐指数
2
解决办法
1258
查看次数