44

これは非常に奇妙で、誰かが何か考えを持っているかどうか疑問に思っていますか?

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れます!

4

9 に答える 9

83

私もこれを起こして、この回避策を実行することになりました:

[UIView animateWithDuration:.25 animations:^{
    self.scrollView.contentOffset = ...;
}];
于 2012-03-09T16:45:31.967 に答える
8

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

私は問題を完全に追跡していませんが、問題は次のようになると思います。

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

上記の解決策はどういうわけかこのサイクルを壊しますが、おそらくそれほど厄介な解決策は、コードにブレークポイントを置き、複数の呼び出しを排除することです。

于 2013-06-03T13:42:23.707 に答える
2

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

  1. ペン先を使用した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];
    }
    

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

于 2011-06-15T21:55:33.963 に答える
1

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);
    }
);
于 2015-04-02T02:08:53.073 に答える
1

aepryusソリューションが言うように、私はテーブルビューを使用しています。setContentOffset :は他のアニメーションと同時に呼び出されます。

私の場合、このコマンドを逆にしただけです。

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

このような

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

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

于 2018-07-14T14:20:05.677 に答える
0

ScrollViewがスクロールしないのと同じ問題に直面しました。

次に、ビューで[自動レイアウトを使用]を無効にしました。その後、ScrollViewが機能します。

于 2014-05-26T03:58:50.070 に答える
0

私も同じ問題を抱えていました。私の場合、私も傍受していました。

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

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

[scrollView setContentOffset:currentOff animated: YES];

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

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

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

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

于 2014-08-06T18:27:21.807 に答える
0
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)

            })
    })

}
于 2016-05-30T07:39:21.807 に答える
-2

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

[scrollView setContentOffset:CGPointMake(240, 0) animated:YES];
于 2011-03-08T12:37:28.730 に答える