これは非常に奇妙であり、誰かが何か考えを持っているのだろうか?
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
_が使用されている場合は呼び出されます!
私もこれを起こして、この回避策を実行しました:
[UIView animateWithDuration:.25 animations:^{
self.scrollView.contentOffset = ...;
}];
個人的な経験から言えば、この問題は、アニメーションが実行される前にsetContentOffset:が複数回呼び出されたときに発生します。
問題を完全に追跡したわけではありませんが、問題は次のようになっていると思います。
新しいオフセット値を設定するsetContentOffset:animatedが呼び出されます。 setContentOffset:その後、同じパラメーターで呼び出され、アニメーションをキャンセルします。また、新しいパラメーターは古いパラメーターと同じであるため、アニメーションがまだ実行されていなくても、何も実行する必要がないことを前提としています。
上記の解決策は何らかの形でこのサイクルを中断しますが、おそらくそれほど気味の悪い解決策は、コードにブレークポイントを配置し、複数の呼び出しを排除することです。
あなたが与えたコードの一部で言うのは難しいです。実際、プロジェクトがあり、すべてが同じ条件で動作していると言っている場合、明らかに条件は同じではありません:)私は問題を再現できませんでしたが、ここにいくつかの仮定があります2件:
Nibを使用したUIScrollViewの作成。
-(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];
}
これは私のために動作します。これがお役に立てば幸いです。
aepryusソリューションの が言うように、私はtableviewsで作業しています:setContentOffset:は他のアニメーションと同時に呼び出されます。
私の場合、このコマンドを反転させただけです。
[tableView reloadData];
[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];
このような
[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];
[tableView reloadData];
コンテンツオフセットが正常に変更された後、アニメーションが開始されます。
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);
}
);
あなたが試すことができます:
[scrollView setContentOffset:CGPointMake(240, 0) animated:YES];
私は同じ問題を抱えていましたが、私の場合は傍受していました:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...}
このメソッドは次の直後に呼び出されます:(アニメーションの終了まで待機しません):
[scrollView setContentOffset:currentOff animated: YES];
つまり、アニメーションの終了を「待機」するロジックがあり、scrollViewDidEndScrollingAnimationをインターセプトした場合、結果は未定義になります。IE:アニメーションを途中で終了します。
編集:受け入れられた解決策/回避策:
[UIView animateWithDuration:.25 animations:^{
self.scrollView.contentOffset = ...;
}];
また、contentOffsetを直接設定してもscrollViewDidEndScrollingAnimationが呼び出されないため、私のシナリオでは「機能します」
ScrollViewがスクロールしないという同じ問題に直面しています。そして、ビューで「自動レイアウトを使用」を無効にすると、ScrollViewが機能します。
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)
})
})
}