为什么当鼠标通过滚动或动画从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同样的问题而不将其添加为子视图,因此这不是问题.
我有一个在后台运行的实用程序Mac应用程序(LSUIElement启用).在某些情况下,此应用程序显示带有几个按钮的菜单窗口.问题是,当我将鼠标悬停在此窗口上时,鼠标光标仍然会根据其下方的应用程序运行 - 当菜单下有文本时,光标会变为插入"I beam"形状.
显然我更喜欢常规指针箭头.我NSTrackingArea经过一些黑客攻击后潜入了朋友,我可以检测到鼠标输入和鼠标退出事件.但是当我尝试使用NSCursor鼠标输入更改当前光标时,没有任何反应.看起来机器拒绝从非活动应用程序更改游标,因为当我在鼠标输入事件之前激活应用程序时,光标会改变.
我不想仅仅为了更改光标而切换活动应用程序.有没有办法摆脱非活动应用程序的光标?
我想实现一个功能,当用户将鼠标悬停在特定区域上时,新视图将显示为类似抽屉的动画.而且,当用户离开特定区域时,抽屉应该消失动画.这正是您在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) 有没有办法在不继承 NSTextView 的情况下将光标设置为指向文本视图的指针?
我阅读了很多关于 NSTrackingAreas 的内容,测试了很多示例,设置了不同的跟踪选项并实现了不同的方法,但光标仍然是 I-Beam。我已经读到它是 AppKit 自动功能,那么我该如何防止这种情况发生?
谢谢!
我正在尝试更改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)
也没用.我究竟做错了什么?
我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)
那么鼠标方法会触发,但显然只有在释放鼠标按钮时才会触发。
好的,问题是:
我有一个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 ×6
macos ×3
nscursor ×3
objective-c ×2
swift ×2
cursor ×1
mouse-cursor ×1
nsanimation ×1
nsbutton ×1
nstextfield ×1
nstextview ×1