特定于触摸条的NSScrubber
控件在平移手势上随惯性滚动。我想收到此动画结束的通知以执行某些功能。
试试 1
NSScrubberDelegate
有一个- didFinishInteractingWithScrubber:
我实现的方法。但是,在我停止直接操作擦洗器后不久——将手指从触摸栏上抬起——我收到了回调,但由于惯性,滚动继续发生。被选中的最后一项不是回调此委托方法时的项。
试试 2
进一步挖掘,我遇到了NSAnimation
。虽然没有明确记录,但我认为 scrubber 也是一个NSAnimatablePropertyContainer
,因为它的selectedIndex
属性文档说可以通过 animator 代理为选择设置动画:scrubber.animator.selectedIndex = i
. 凭借这种美德,假设平滑平移的动画属性是boundsOrigin
,我尝试查询它。
我能够CAAnimation
通过这样做得到一个
CAAnimation* a = [NSScrubber defaultAnimationForKey:@"boundsOrigin"];
// returns the same pointer value as above
// a = [myScrubber animationForKey:@"boundsOrigin"];
a.delegate = self;
...
- (void)animationDidStop:(CAAnimation *)anim
finished:(BOOL)flag {
if (flag == YES)
NSLog(@"Animation ended!\n");
}
我得到一个有效的指针值a
。但是,我接到了无数电话animationDidStop
,他们所有人都有flag = YES
;当洗涤器滚动时,我不断收到这些呼叫,当滚动停止时呼叫停止。这感觉最接近我想要的,但我不知道为什么动画结束时会有这么多电话而不是一个。
由于NSScrubber
'sNSView
或未NSScrollView
公开,我不确定我是否正在查询正确的对象以到达正确的NSAnimation
.
尝试 3
我还尝试了在操作端代码上执行此操作的 hacky 路线,但徒劳无功
-(void)didFinishInteractingWithScrubber:(NSScrubber *)scrubber {
NSLog(@"Manipulation ended\n");
NSAnimationContext*c = NSAnimationContext.currentContext;
[c setCompletionHandler:^{
NSLog(@"Inertial scrolling stopped!\n");
}];
}
完成处理程序几乎立即被调用,在惯性滚动停止之前:(
问
无论如何要知道洗涤器的平移手势惯性动画何时结束?