NSScrollview不能以编程方式滚动?

时间:2013-10-30 05:32:54

标签: objective-c macos cocoa iboutlet nsscrollview

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

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

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

当我尝试从界面构建器设置我的NSScrollview的新引用插座并将该行转到文件的所有者时,我只看到一个选项“委托”。我没有看到插件scrollview。 所以我将scrollview连接到文件所有者的委托(因为我看不到scrollview插座)。

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

 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 个答案:

答案 0 :(得分:14)

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]];
}

如果您想要动画滚动,则必须通过动画制作代理设置boundsOrigin。 (因为NSScrollViewNSClipView都没有公开可设置动画的滚动点属性)

- (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];
}

答案 1 :(得分:3)

更好的方法来实现这一点,翻转视图。我已经努力将滚动视图放到顶部。

-(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];
}

答案 2 :(得分:1)

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

但更好的选择是在xib中使用NSObject并将其类设置为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]];

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

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

答案 3 :(得分:1)

我发现如果您使用NSViewController,则需要在viewWillAppear方法中执行'scrollPoint',而不是viewWillLoad。 FYI。