NSScrollView并在滚动时手动设置内容偏移量

时间:2014-09-11 15:52:17

标签: macos cocoa delay nsscrollview endlessscroll

我正在尝试构建一个无尽的NSScrollView,即一个可以向任一方向无限滚动的滚动视图。这是通过具有固定尺寸的滚动视图来实现的,该滚动视图被重新定位'一旦它太靠近任一边缘,并跟踪在重新定位时更新的额外无限偏移。如果我没记错的话,Apple甚至在iOS的WWDC视频中演示了这种方法。

在iOS上一切正常。我在-scrollViewDidScroll:中执行重新定位逻辑,它甚至在滚动动作减速而不打破减速度时起作用。

现在为Mac版本。让我告诉你,我对Mac开发相当新,所以我可能根本就没有在正确的位置执行这些操作。我目前在-reflectScrolledClipView:中有重新定位的逻辑。但是,当我立即执行移动操作时,滚动视图会跳到我想要的两倍(在本例中为4000)。如果我稍微延迟该方法,它就会按预期工作。

- (void)reflectScrolledClipView:(NSClipView *)cView
{
    [self recenteringLogic];
    [super reflectScrolledClipView:cView];
}

- (void)recenteringLogic
{
    CGFloat offset = self.documentVisibleRect.origin.y;

    if (offset > 6000) {

        // This makes the scroll view jump to ~4000 instead of 5000.
        [self performSelector:@selector(move) withObject:nil];

        // This works, but seems wrong to me
//        [self performSelector:@selector(move) withObject:nil afterDelay:0.0];
    }
}

- (void)move
{
    [self.documentView scrollPoint:NSMakePoint(0, 4000)];
}

关于如何实现我想要的行为的任何想法?

2 个答案:

答案 0 :(得分:0)

试试这个:

- (void)scrollWheel:(NSEvent *)event {
    [super scrollWheel:event];
    [self recenteringLogic];
}

- (void)recenteringLogic
{
    NSRect rect = self.documentVisibleRect;
    if (rect.origin.y > 6000) {
            rect.origin.y = 4000;
            [self.contentView setBounds:rect];
    }
}

reflectScrolledClipView似乎以某种方式与scrollToPoint冲突,当与[self.contentView setBounds:rect]一起使用时,它导致堆栈溢出;滚动方法。

答案 1 :(得分:0)

我最终与[self performSelector:@selector(move) withObject:nil afterDelay:0.0];合作,并没有遇到任何严重的问题,尽管它看起来有点不对。