3

無限の NSScrollView、つまり、どちらの方向にも無限にスクロールできるスクロール ビューを構築しようとしています。これは、いずれかの端に近づきすぎると「再中央揃え」される固定寸法のスクロール ビューを持ち、再中央揃え時に更新される追加のエンドレス オフセットを追跡することによって実現されます。私の記憶が正しければ、Apple は iOS 用の WWDC ビデオでこのアプローチを実演しました。

iOSではすべてが機能しています。再センタリング ロジックを実行する-scrollViewDidScroll:と、減速を中断せずにスクロール モーションが減速している場合でも機能します。

さて、Mac版です。私は Mac 開発にかなり慣れていないので、これらの操作を正しい場所で実行していない可能性があります。現在、再センタリング ロジックが にあり-reflectScrolledClipView:ます。ただし、移動操作をすぐに実行すると、スクロール ビューは目的の 2 倍 (この場合は 4000) までジャンプします。メソッドを少し遅らせると、期待どおりに機能します。

- (void)reflectScrolledClipView:(NSClipView *)cView
{
    [self recenteringLogic];
    [super reflectScrolledClipView:cView];
}

- (void)recenteringLogic
{
    CGFloat offset = self.documentVisibleRect.origin.y;

    if (offset > 6000) {

        // This makes the scroll view jump to ~4000 instead of 5000.
        [self performSelector:@selector(move) withObject:nil];

        // This works, but seems wrong to me
//        [self performSelector:@selector(move) withObject:nil afterDelay:0.0];
    }
}

- (void)move
{
    [self.documentView scrollPoint:NSMakePoint(0, 4000)];
}

私が望む動作をどのように達成できるかについてのアイデアはありますか?

4

2 に答える 2

0

これを試して:

- (void)scrollWheel:(NSEvent *)event {
    [super scrollWheel:event];
    [self recenteringLogic];
}

- (void)recenteringLogic
{
    NSRect rect = self.documentVisibleRect;
    if (rect.origin.y > 6000) {
            rect.origin.y = 4000;
            [self.contentView setBounds:rect];
    }
}

ReflectScrolledClipView が scrollToPoint と何らかの理由で衝突しているように見え、 [self.contentView setBounds:rect]; で使用するとスタック オーバーフローが発生しました。スクロール方法。

于 2014-09-11T21:57:57.530 に答える