Временное отключение событий мыши после показа окна - PullRequest
0 голосов
/ 07 мая 2019

enter image description here

При вводе URL в окне Safari появится дочернее окно предложений. Временно скрывает и отключает ввод мыши. Как это сделать?

У меня есть проект (ссылка ниже), в котором реализовано расположение, предполагающее + скрытие мыши. Я не знаю, как отключить мышь, чтобы перестать выбирать подсказки, когда позиция мыши находится над окном подсказок во время набора (он всегда выбирает некоторые из этих записей).

Я знаю, что скрытая магия должна быть чем-то вроде NSTrackingArea

/* Properly creates a tracking area for an image view.
*/
- (id)trackingAreaForView:(NSView *)view {
    // make tracking data (to be stored in NSTrackingArea's userInfo) so we can later determine the imageView without hit testing
    NSDictionary *trackerData = [NSDictionary dictionaryWithObjectsAndKeys:view, kTrackerKey, nil];

    NSRect trackingRect = [[self.window contentView] convertRect:view.bounds fromView:view];
    NSTrackingAreaOptions trackingOptions = NSTrackingEnabledDuringMouseDrag | NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp;
    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:trackingRect options:trackingOptions owner:self userInfo:trackerData];

    return trackingArea;
}

/* The mouse is now over one of our child image views. Update selection and send action.
*/
- (void)mouseEntered:(NSEvent*)event {
    HighlightingView *view = [(NSDictionary*)[event userData] objectForKey: kTrackerKey];
    [self userSetSelectedView:view];
}

Проект: https://github.com/xhruso00/MapkitSearchFieldOSX

Предложения? Как apple отключает ввод мышью для предложений (карты ...)

PS: Я хотел бы продолжать выделять предложения. Не хочу его отключать.

1 Ответ

0 голосов
/ 07 мая 2019

Добавление NSTrackingMouseMoved к NSTrackingMouseEnteredAndExited и запоминание того, какое представление находилось под мышьюEntered: решена проблема.

@interface SuggestionsWindowController() {
    HighlightingView *_mouseEnteredView; //ADDED
}



///* The mouse is now over one of our child image views. Update selection and send action.
//*/
- (void)mouseEntered:(NSEvent*)event {
    HighlightingView *view = [(NSDictionary*)[event userData] objectForKey: kTrackerKey];
    _mouseEnteredView = view; //ADDED
    //[self userSetSelectedView:view];
}

//ADDED
- (void)mouseMoved:(NSEvent*)event {
    //userData is not attached to event and it will crash if one accesses it
    //HighlightingView *view = [(NSDictionary*)[event userData] objectForKey: kTrackerKey];

    [self userSetSelectedView:_mouseEnteredView];
}

/* The mouse has left one of our child image views. Set the selection to no selection and send action
*/
- (void)mouseExited:(NSEvent*)event {
    [self userSetSelectedView:nil];
    _mouseEnteredView = nil; //ADDED
}
...