0

特定于触摸条的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");
    }];
}

完成处理程序几乎立即被调用,惯性滚动停止之前:(

无论如何要知道洗涤器的平移手势惯性动画何时结束?

4

1 回答 1

0

我终于找到了为平移手势的惯性滚动动画结束注册回调的方法。

像任何其他滚动视图一样,它也有NSScrollViewDidEndLiveScrollNotification。使用通知中心注册回调!

NSScrollView *sv = myScrubber.enclosingScrollView;
// register for NSScrollViewWillStartLiveScrollNotification if start is also needed
[[NSNotificationCenter defaultCenter] addObserverForName:NSScrollViewDidEndLiveScrollNotification
                                                  object:sv
                                                   queue:nil
                                              usingBlock:^(NSNotification * _Nonnull note) {
                                                  NSLog(@"Scroll complete");
                                              }];

感谢这个答案展示了这种方法。

于 2019-03-30T18:54:33.990 回答