NSScrollView在滚动时跳到底部

时间:2010-12-22 05:19:06

标签: objective-c cocoa nsscrollview

我有一个包含NSImageView的NSScrollView,它根据各种因素调整大小。调整大小时我通常会更改图像,因此我将NSScrollView滚动到顶部。这很好用。但是,当我再次开始滚动NSScrollView时,它会移动几个像素然后(大部分时间)跳转到滚动的底部。跳转一次后,它会正常工作,直到我再次将滚动条移到顶部。这让我疯了。我真正做的就是:

[_imageView setImage: anNSImage];

NSRect frame;

NSSize imageSize = [anNSImage] size];
frame.size = imageSize;
frame.origin = NSZeroPoint;

[_imageView setFrame: frame];
[[_mainScrollview contentView] scrollToPoint: NSMakePoint(0, [_imageView frame].size.height - [_mainScrollview frame].size.height)];

6 个答案:

答案 0 :(得分:8)

尼克,谢谢你的代码。 我修改了你的代码,现在效果很好。 首先,您需要将垂直卷轴滚动到顶部。其次,滚动内容视图。

    // Scroll the vertical scroller to top
    if ([_scrollView hasVerticalScroller]) {
        _scrollView.verticalScroller.floatValue = 0;
    }

    // Scroll the contentView to top
    [_scrollView.contentView scrollToPoint:NSMakePoint(0, ((NSView*)_scrollView.documentView).frame.size.height - _scrollView.contentSize.height)];

答案 1 :(得分:3)

要绕过此错误,您只需启用滚动条,然后设置滚动条的隐藏属性。由于NSScrollers继承自NSView,这只会阻止它们显示自己:

mainScrollView.hasHorizontalScroller = YES;
mainScrollView.hasVerticalScroller = YES;
mainScrollView.verticalScroller.hidden = YES;
mainScrollView.horizontalScroller.hidden = YES;

至少对我有用。仅在OS 10.7.2上测试过。

有没有人在这一个btw上有雷达?如果没有人告诉他们,他们不会修理它。 :)

答案 2 :(得分:2)

似乎我可以使用reflectScrolledClipView:而不是设置滚动条的值来同步位置。实施例

[self.scrollView.contentView scrollToPoint:NSMakePoint(300, 0)];
[self.scrollView reflectScrolledClipView:self.scrollView.contentView]; // synced then

答案 3 :(得分:0)

我的hacky解决方案。打开Show Vertical Scroller(就像Chetan说的那样,这就是触发bug的原因)。将表格视图发送回去。展开表视图的左边缘,直到滚动条被其右边缘覆盖。

答案 4 :(得分:0)

在macOS Sierra上,[_scrollView.contentView scrollToPoint:];出现了问题,导致闪烁不稳定。但是,使用[_scrollView.documentView scrollPoint:]可以解决所有这些问题。这也是Apple在其here教程中建议的方法。

答案 5 :(得分:-4)

设置scrollView.contentOffset = CGPointMake(0,0)。或根据您的要求。更改图像后设置contectoffset。