Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTableView scrollRowToVisible带动画_Objective C_Cocoa_Nstableview - Fatal编程技术网

Objective c NSTableView scrollRowToVisible带动画

Objective c NSTableView scrollRowToVisible带动画,objective-c,cocoa,nstableview,Objective C,Cocoa,Nstableview,我正在尝试实现一个操作以滚动到NSTableView的顶部和底部。我使用的是scrollRowToVisible,但我希望这个动作能够动画化。有办法做到这一点吗?这似乎是不可能的。NSTableView不支持10.6之前的任何类型的动画。从MasOSX10.7开始,在类中添加了一些简单的动画。可以设置插入、删除行以及将行移动到新位置的动画。到目前为止就是这样。没有简单的方法,但我会通过子类化NSAnimation来实现它,当它从0.0发展到1.0时,将其乘以总滚动距离以获得偏移量,然后依次调用s

我正在尝试实现一个操作以滚动到NSTableView的顶部和底部。我使用的是
scrollRowToVisible
,但我希望这个动作能够动画化。有办法做到这一点吗?

这似乎是不可能的。NSTableView不支持10.6之前的任何类型的动画。从MasOSX10.7开始,在类中添加了一些简单的动画。可以设置插入、删除行以及将行移动到新位置的动画。到目前为止就是这样。

没有简单的方法,但我会通过子类化NSAnimation来实现它,当它从0.0发展到1.0时,将其乘以总滚动距离以获得偏移量,然后依次调用scrollToPoint:以提供平滑滚动动作的外观。虽然我不确定scrollview的配合程度,但它在理论上应该是可行的。

虽然NSTableView没有滚动属性,但您可以直接设置动画,相反,您可以通过一点数学设置NSTableView所在的NSClipView的滚动动画

下面是我如何(在NSTableView的自定义子类中)平滑地设置rowIndex处的行的动画,以便滚动到视图的中心(如果可能):

        NSRect rowRect = [self rectOfRow:rowIndex];
        NSRect viewRect = [[self superview] frame];
        NSPoint scrollOrigin = rowRect.origin;
        scrollOrigin.y = scrollOrigin.y + (rowRect.size.height - viewRect.size.height) / 2;
        if (scrollOrigin.y < 0) scrollOrigin.y = 0;
        [[[self superview] animator] setBoundsOrigin:scrollOrigin];
NSRect rowRect=[self-rectOfRow:rowIndex];
NSRect viewRect=[[self superview]帧];
NSPoint scrollOrigin=rowRect.origin;
scrollOrigin.y=scrollOrigin.y+(rowRect.size.height-viewRect.size.height)/2;
如果(scrollOrigin.y<0)scrollOrigin.y=0;
[[self superview]动画师]setBoundsOrigin:scrollOrigin];

如果您的目标是10.8+,并且您的表视图是层备份的,则可以执行以下操作:

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
    context.allowsImplicitAnimation = YES;
    [self.tableView scrollRowToVisible:someRow];
} completionHandler:NULL];

太棒了,我要试试!这很有效!这是我想出的最后一个方法,想法相同,但略有不同。它也会在Lion上闪烁滚动条:至少当与Lion上的核心动画和核心图像过滤器结合使用时,看起来是破碎的。我正在尝试对NSTableView进行运动模糊滚动,当滚动多个屏幕时,内容不会被绘制。这里的问题相同。表格变为空白,然后我看到靠近目标行的行移动到位。这就像滚动过程中tableview的常规布局被破坏,并没有可回收的视图。这是唯一一个一直滚动到我的NSTableView底部的代码。唯一需要注意的是,它不能很好地与NSDrawNinePartImage(失真和图像故障)配合使用。我最终用NSImageViews重新发明了我自己的九部分图像方法,它工作得完美无瑕!当我开始为NSTableView实现自己的自定义滚动机制时,每秒调用
setBoundsOrigin:
60次实际上会产生一些非常惊人的结果。谢谢你给我的提示,方向正确。效果很好!但只有当图层后退时