注意:水平和垂直滚动条都可以在屏幕上看到并且工作正常。但我不能让它们以编程方式移动。
我正在开发一个可可桌面应用程序。我在我的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]];
}
此代码不起作用,滚动条不会自动滚动。有人请帮忙。 我正在尝试使用此代码制作慢速滚动动画。
答案 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
。 (因为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];
}
答案 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。