3

我正在尝试构建一个无限的 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)];
}

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

4

2 回答 2

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] 一起使用时导致堆栈溢出;滚动的方法。

于 2014-09-11T21:57:57.530 回答
0

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

于 2015-02-13T10:38:56.830 回答