web-dev-qa-db-ja.com

animated:yesが設定されている場合、uiscrollview setcontentoffsetアニメーションがスクロールしない問題

これは非常に奇妙であり、誰かが何か考えを持っているのだろうか?

IPadでボタンを押したときにUIScrollViewをスクロールしようとしています。

私が行った場合:

_CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: NO];
_

スクロールビューは期待どおりに必要な位置にジャンプしますが、スクロールしたいです。しかし、私がするとき:

_CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: YES];
_

その後、何もしません!正常に動作し、_setContentOffset:YES_に応答する別のスクロールビューがあるので、非常に困惑しています。スクロールが発生しない理由についてのアイデアは大歓迎です!

また、- (void)scrollViewDidScroll:(UIScrollView *)senderは、_animated:YES_が使用されている場合は何も受信していませんが、_animated:NO_が使用されている場合は呼び出されます!

42
BountyBob

私もこれを起こして、この回避策を実行しました:

[UIView animateWithDuration:.25 animations:^{
    self.scrollView.contentOffset = ...;
}];
79

個人的な経験から言えば、この問題は、アニメーションが実行される前にsetContentOffset:が複数回呼び出されたときに発生します。

問題を完全に追跡したわけではありませんが、問題は次のようになっていると思います。

新しいオフセット値を設定するsetContentOffset:animatedが呼び出されます。 setContentOffset:その後、同じパラメーターで呼び出され、アニメーションをキャンセルします。また、新しいパラメーターは古いパラメーターと同じであるため、アニメーションがまだ実行されていなくても、何も実行する必要がないことを前提としています。

上記の解決策は何らかの形でこのサイクルを中断しますが、おそらくそれほど気味の悪い解決策は、コードにブレークポイントを配置し、複数の呼び出しを排除することです。

7
aepryus

あなたが与えたコードの一部で言うのは難しいです。実際、プロジェクトがあり、すべてが同じ条件で動作していると言っている場合、明らかに条件は同じではありません:)私は問題を再現できませんでしたが、ここにいくつかの仮定があります2件:

  1. Nibを使用したUIScrollViewの作成。

    • IBOutletを作成し、nibのscrollView要素にバインドすることを忘れないでください。単純なビューベースのアプリケーションでは、すぐにscrollViewがアニメーションで希望どおりに機能するようになりました(YESとNOの両方)。しかし、仕事をするために

    -(void)scrollViewDidScroll:(UIScrollView *)sender;デリゲートを設定する必要があります。

yourScrollView.delegate = self;

ここで、「self」はクラスであり、scrollViewDidScroll関数があります。このクラスは、「UIScrollViewDelegate」プロトコルに準拠する必要があります。

2.UIScrollViewオブジェクトの手動作成。

  • ここでの考え方は基本的に同じなので、簡単なコードを提供します。

    -(void) creatingScrollView {
        UIScrollView *newScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 5, 280, 44)];
        newScroll.pagingEnabled = YES;
        newScroll.showsVerticalScrollIndicator = NO;
        newScroll.showsHorizontalScrollIndicator = NO;
    
        // ... some subviews being added to our scroll view
    
        newScroll.delegate = self;
        [self.view addSubview:newScroll];
        [newScroll release];
    }
    

これは私のために動作します。これがお役に立てば幸いです。

2
makaron

aepryusソリューションの が言うように、私はtableviewsで作業しています:setContentOffset:は他のアニメーションと同時に呼び出されます

私の場合、このコマンドを反転させただけです。

[tableView reloadData];
[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];

このような

[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];
[tableView reloadData];

コンテンツオフセットが正常に変更された後、アニメーションが開始されます。

1
Marco

Xamarin.iOSのソリューション

InvokeOnMainThread(() =>
{
  scrollView.SetContentOffset(new PointF((page * UIScreen.MainScreen.Bounds.Width), 0), true);
});

これはUIView.Animateを使用して解決することもできます

UIView.Animate(
    duration: .25,
    animation: () =>
    {
       scrollView.SetContentOffset(new PointF((value * UIScreen.MainScreen.Bounds.Width), 0), true);
    }
);
1
ben

あなたが試すことができます:

[scrollView setContentOffset:CGPointMake(240, 0) animated:YES];
0
mtompson

私は同じ問題を抱えていましたが、私の場合は傍受していました:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...}

このメソッドは次の直後に呼び出されます:(アニメーションの終了まで待機しません):

[scrollView setContentOffset:currentOff animated: YES];

つまり、アニメーションの終了を「待機」するロジックがあり、scrollViewDidEndScrollingAnimationをインターセプトした場合、結果は未定義になります。IE:アニメーションを途中で終了します。

編集:受け入れられた解決策/回避策:

[UIView animateWithDuration:.25 animations:^{
    self.scrollView.contentOffset = ...;
}];

また、contentOffsetを直接設定してもscrollViewDidEndScrollingAnimationが呼び出されないため、私のシナリオでは「機能します」

0
Dado

ScrollViewがスクロールしないという同じ問題に直面しています。そして、ビューで「自動レイアウトを使用」を無効にすると、ScrollViewが機能します。

0
ChengChieh
func scrollViewDidScroll(scrollView: UIScrollView) {

    dispatch_async(dispatch_get_main_queue(),{

        UIView.animateWithDuration(0.10, animations: { () -> Void in

            let loginScrollViewCurrentPosition:CGPoint = CGPointMake(self.loginScrollView.contentOffset.x, self.loginScrollView.contentOffset.y) as CGPoint
            self.loginScrollView.setContentOffset(loginScrollViewCurrentPosition, animated: true)

            })
    })

}
0
A.G