我正在尝试构建一个无尽的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)];
}
关于如何实现我想要的行为的任何想法?
答案 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];
合作,并没有遇到任何严重的问题,尽管它看起来有点不对。