NSView от Cocoa получает безумные события наведения курсора мыши?

StackOverflow https://stackoverflow.com/questions/2076248

  •  21-09-2019
  •  | 
  •  

Вопрос

Привет всем - у меня есть подкласс NSView, который я программно перемещаю при наведении курсора мыши.Который работает, но имеет странный побочный эффект:

  1. Я нажимаю на вложенное представление.Подвиды удаляются [ХОРОШО]
  2. Я жду некоторое время.Я не двигаю своей мышью.Поскольку вложенный просмотр переместился, он больше не находится под моим курсором.
  3. Я снова щелкаю мышью.
    • Я ожидаю, что базовое окно получит событие наведения курсора мыши (поскольку вложенный просмотр больше не находится под моим курсором), однако мой вложенный просмотр каким-то образом получает это событие [СТРАННО]
    • Событие наведения курсора мыши ясно показывает, что щелчок был за пределами моего подкласса [СТРАННО]
    • Событие mouseDown также ясно показывает, что количество кликов увеличилось, хотя я ждал несколько секунд между щелчками мыши [СТРАННО]

...должно быть объяснение тому, что я вижу.Вот мой код - просто создайте новый проект приложения Cocoa под названием "OddMouse" и скопируйте следующее в файл OddMouseAppDelegate.h:

#import <Cocoa/Cocoa.h>
@interface OddMouseAppDelegate : NSObject <NSApplicationDelegate> {
  NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@end

@interface OddView : NSView {
}
@end

...и следующее в файл OddMouseAppDelegate.m:

#import "OddMouseAppDelegate.h"
@implementation OddMouseAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

[[просмотр содержимого окна] Добавляет SUBVIEW:[[Инициализация выделения OddView]];} @конец

@implementation OddView
- (id)init {
  self = [super initWithFrame:NSMakeRect(100, 100, 100, 100)];
  return self;
}
- (void)drawRect:(NSRect)dirtyRect {
  NSBezierPath *bz = [NSBezierPath bezierPathWithRoundedRect:[self bounds] 
                                                 xRadius:9 yRadius:9];
  [[NSColor blueColor] set];
[bz fill];
}
- (void)mouseDown:(NSEvent *)event {
  NSPoint locationInMyself = [self convertPoint: [event locationInWindow] 
                                       fromView: nil];
  NSLog(@"MOUSE DOWN COORDS: x=%f y=%f, count=%i", 
          locationInMyself.x, locationInMyself.y, [event clickCount]);
  float newX = [self frame].origin.x+100;
  float newY = [self frame].origin.y+100;
  [self setFrame:NSMakeRect(newX, newY, 100, 100)];
}
@end

...тогда стройте, затем бегите, затем наблюдайте !FWIW, вот что я вижу в консоли:

10-01-15 11:38:24 PM OddMouse[4583] MOUSE DOWN COORDS: x=48.000000 y=56.000000, count=1
10-01-15 11:38:37 PM OddMouse[4583] MOUSE DOWN COORDS: x=-52.000000 y=-44.000000, count=2
10-01-15 11:38:44 PM OddMouse[4583] MOUSE DOWN COORDS: x=-152.000000 y=-144.000000, count=3
10-01-15 11:38:52 PM OddMouse[4583] MOUSE DOWN COORDS: x=-252.000000 y=-244.000000, count=4
10-01-15 11:39:03 PM OddMouse[4583] MOUSE DOWN COORDS: x=-352.000000 y=-344.000000, count=5
Это было полезно?

Решение

Черт возьми - оказывается, это было что-то неправильное со скоростью двойного щелчка - изменение настроек привело к SFA, но перезагрузка разрешилась...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top