Как определить, когда пользователь и только пользователь прокручивает NSScrollView - PullRequest
1 голос
/ 02 марта 2012

Кто-нибудь знает способ определения, когда NSScrollView прокручивается пользовательским вводом и только пользовательским вводом)?

Причина, по которой я хочу это сделать, заключается в том, что у меня есть NSScrollView сcontentView, что постоянно увеличивает его ширину.Я хочу, чтобы NSScrollView заблокировал правый конец contentView (т.е. отслеживал его), если пользователь прокручивает правый конец contentView, и я хочу, чтобы «блокировка» была снята, когда пользователь (итолько правые стороны.

Самое близкое, что мне нужно было сделать, чтобы это работало, это наблюдение NSViewBoundsDidChangeNotification и изменение переменной 'lock', как показано здесь:

- (void)drawRect:(NSRect)dirtyRect
{
(...)
    if (lockToEnd) {
        NSLog(@"xAxisView at end");
        NSPoint newScrollOrigin;
        newScrollOrigin.y = 0;
        newScrollOrigin.x = [self frame].size.width - [[self enclosingScrollView] bounds].size.width;
        [self scrollPoint:newScrollOrigin];
    }
}

-(void)SWXAxisViewDidScroll:(NSNotification *)note{
    NSLog(@"XAxisDidScroll: %@",note);
    if ([[[self enclosingScrollView] horizontalScroller] floatValue] > 0.97){
        lockToEnd = YES;
    } else {
        lockToEnd = NO;
    }
}

Однако это было неуместно, потому что NSViewBoundsDidChangeNotification отправляется каждый раз, когда границы изменяются, и, таким образом, когда границы contentView увеличиваются, NSScroller уменьшает его floatValue и мой метод наблюденияназывается.Даже если я установлю NSScroller s floatValue на 1.0, он сбрасывается на 0.0, когда bounds.size.width из contentView сначала превышает bounds.size.width из NSScrollView.Таким образом, я не могу сказать, было ли отправлено NSViewBoundsDidChangeNotification из-за прокрутки пользователем или из-за расширения contentView.

Я рассмотрел подклассы NSScroller и использование mouseDown: и mouseDragged:методы для отслеживания ввода пользователя и обновления моей переменной блокировки.Однако меня беспокоит то, что эти методы не будут вызываться, если пользователь прокручивает свой трекпад для прокрутки.Еще одна меньшая проблема, которая, я думаю, является необоснованной, заключается в том, что она может нарушить отношения NSScrollView <-> NSScroller, и мне пришлось бы повторно реализовать множество функций прокрутки.

Я пропустилболее простой способ сделать это?Кажется, я должен быть в состоянии сделать это, потому что документы делают это все время?Мои опасения по поводу подкласса NSScroller действительны?

...