6

注意:水平和垂直滚动条在屏幕上都可见并且工作正常。但我不能让它们以编程方式移动。

我正在开发一个可可桌面应用程序。我在我的 Mainmenu.xib 文件中使用 NSScrollview,我正在它的所有者中创建一个插座,即 Appdelegate.h 。这里是出口

@property(nonatomic,retain) IBOutlet NSScrollView* scrollview;

当我尝试从界面生成器设置我的 NSScrollview 的新引用出口并将线路转到文件所有者时,我只看到一个选项“委托”。我没有看到出口滚动视图。所以我将滚动视图连接到文件所有者中的委托(因为我看不到滚动视图出口)。

现在我正在尝试在我的代码中进行自动滚动。这是代码

for(int a=0;a<10000;a++)
{
    NSPoint pointToScrollTo = NSMakePoint ( 100+a,100+a );  // Any point you like.
    [[self.scrollview contentView] scrollToPoint: pointToScrollTo];
    [self.scrollview reflectScrolledClipView: [self.scrollview contentView]];
}

此代码不起作用,并且滚动条不会自动滚动。

我正在尝试使用此代码制作缓慢的滚动动画。

4

4 回答 4

19

NSClipView有一个scrollToPoint:方法,可用于以编程方式滚动:

- (IBAction)scrollToMid:(id)sender
{
    CGFloat midYPoint = [self.scrollView contentView].frame.size.height/2.0;
    [[self.scrollView contentView] scrollToPoint:NSMakePoint(0.0, midYPoint)];
    [self.scrollView reflectScrolledClipView:[self.scrollView contentView]];
}

如果你想要动画滚动,你必须设置boundsOriginvia animator 代理。(因为既不NSScrollView也不NSClipView公开可动画滚动点属性)

- (IBAction)scrollToMidAnimated:(id)sender
{
    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:2.0];
    NSClipView* clipView = [self.scrollView contentView];
    NSPoint newOrigin = [clipView bounds].origin;
    newOrigin.y = [self.scrollView contentView].frame.size.height/2.0;
    [[clipView animator] setBoundsOrigin:newOrigin];
    [NSAnimationContext endGrouping];
}
于 2013-10-30T07:20:34.660 回答
4

更好的方法是翻转视图。我一直在努力使滚动视图位于顶部。

-(void)scrollToTop:(NSScrollView *)scrollView
{
    NSPoint newScrollOrigin;
    if ([[scrollView documentView] isFlipped]) {
        newScrollOrigin=NSMakePoint(0.0,0.0);
    } else {
        newScrollOrigin=NSMakePoint(0.0,NSMaxY([[scrollView documentView] frame]) -NSHeight([[scrollView contentView] bounds]));
    }

    [[scrollView documentView] scrollPoint:newScrollOrigin];
}

那应该被召唤windowDidLoad来获得这个职位。

-(void)windowDidLoad
{
    [super windowDidLoad];
    [self scrollToTop:_myScroll];
}
于 2014-04-17T07:14:21.743 回答
1

我发现如果你使用NSViewController,你需要在你的viewWillAppear方法中做'scrollPoint',而不是在viewWillLoad. 供参考。

于 2014-11-21T22:48:02.520 回答
1

在文件所有者的身份检查器中,检查其类。它必须设置为NSApplication.您必须将其更改AppDelegate为获取scrollview可以连接滚动视图的插座。

但更好的选择是NSObject在您的 xib 中有 a 并将其类设置为AppDelegate. (但是xcode默认创建它,检查是否AppDelegate存在“占位符”下方的“对象”框中的项目“” FileOwner)。现在将参考出口线从您的对象拖动scrollview到该对象。它将显示您的类的IBOutlet对象名称。Appdelegate

更新:您不能使用 for 循环创建慢速动画。for 循环是如此之快,以至于您只能看到最终结果,而不是完整的滚动。您需要使用核心动画进行慢速动画或 NSTimer 延迟滚动以使其变慢。

另外,请尝试使用 [scrollview documentView] 代替 [scrollview contentView] 。虽然我没有尝试过。

好的,我正在处理它,这是最终结果如果您的滚动条位于顶部,则以下内容会将其移至末尾:

[scroll.contentView scrollToPoint:NSMakePoint(0, ((NSView*)scroll.contentView).frame.size.height - scroll.contentSize.height)];
[scroll reflectScrolledClipView: [scroll contentView]];

您可以根据需要修改上述内容。

甚至您的代码也可以正常工作,但是您需要用相对点代替任何点。

因此,不要将代码放在 for 循环中,而是通过在 xib 上拖动一个按钮来测试它,并在其按钮操作中写入:

NSPoint pointToScrollTo = NSMakePoint ( 100,100 );  // Any point you like.
[[scrollview contentView] scrollToPoint: pointToScrollTo];
[scrollview reflectScrolledClipView: [scrollview contentView]];

现在运行应用程序,将滚动视图的滚动设置到某个随机位置。然后单击按钮并检查滚动是否移动到某处。

如果它有效,那么您的代码很好,您只需要相应地设置点。它对我有用。

于 2013-10-30T06:13:25.740 回答