NSEventPhaseEnded не вызывается для NSScrollView с IKImageBrowserView

У меня есть IKImageBrowserView, встроенный в NSScrollView, чтобы помочь проверить эту проблему, IKImageBrowserView заполняет только половину ширины NSScrollView.

Мой подкласс NSScrollView реализует следующий метод и регистрирует, когда прокрутка начинается и заканчивается в просмотре прокрутки.

- (void)scrollWheel:(NSEvent *)event {
    switch (event.phase) {
        case NSEventPhaseBegan:
            NSLog(@"NSEventPhaseBegan");
            break;
        case NSEventPhaseEnded:
            NSLog(@"NSEventPhaseEnded");
            break;
    }

    [super scrollWheel:event];
}

Фаза события NSEventPhaseBegan успешно вызывает, находится ли курсор над IKImageBrowserView или нет при запуске прокрутки. Это ожидаемое поведение.

Но фаза события NSEventPhaseEnded не вызывается, когда курсор находится над IKImageBrowserView, когда вы прекращаете прокрутку. Если курсор не находится над IKImageBrowserView, вызывается NSEventPhaseEnded.

Почему IKImageBrowserView предотвращает вызов NSEventPhaseEnded в моем NSScrollView?

1 ответ

Решение

Говорил с полезным инженером в Apple, который сказал мне, что такое поведение на самом деле является ошибкой. К сожалению, ImageKit ест некоторые события с колесом прокрутки. В качестве обходного пути, создайте подкласс IKImageBrowserView, реализуйте scrollWheel и перенаправьте событие как в "super", так и в представление scrollview.

@implementation MyImageBrowserView

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

   if ([theEvent phase] == NSEventPhaseEnded) 
       [[self enclosingScrollView] scrollWheel:theEvent];
   }
}

@end
Другие вопросы по тегам