UIScrollViewは期待どおりに動作しますが、scrollRectToVisible:何もしません
-
22-07-2019 - |
質問
以前に UIScrollView
を使用したことがありますが、現在使用していますが、問題はありませんでした。今、古いアプリに追加していますが、期待通りに動作します(コンテンツを見て、指でスクロールできます、すべての境界とサイズが正しく設定されているため、コンテンツに空きスペースがありません、など。)、 scrollToRectVisible
が機能しません。呼び出しを単純化して、単に0,0の位置に移動するようにしました。
[scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];
または0,200に移動します:
[scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];
これをテストするためのクイックアプリを作成しましたが、 scrollRectToVisible
を期待どおりに動作させることができます。しかし、私の古いアプリでは、何もさせることができません。
setContentOffset:
でscrollViewをスクロールできますが、それは私が望むものではありません。
このscrollViewとそのコンテンツは、IBによってペン先で定義され、IBOutletで使用されます。 scrollViewを処理するためにアプリで使用しているコードは
のみです [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];
(私は水平スクロールではなく垂直スクロールにのみ興味があります)。
このような問題に遭遇した人はいますか
両方のアプリでscrollView属性を比較しましたが、それらは同じです。
補足:
scrollViewsフレーム:0.000000 0.000000 480.000000 179.000000
私のscrollViews contentSizeは:0.000000 324.000000
まだ、スクロールしたい四角形が既に表示されているように動作し、スクロールは不要です。それが何が起こっているのかわからない。これはただの大胆なことです。簡単に解決できるようです...
補足#2:
これは、 scrollRectToVisible
なしで行う方法です:
CGPoint point = myRect.origin;
if (![clefScrollView pointInside:point withEvent:nil]) {
point.x = 0;
if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height)
point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height;
[clefScrollView setContentOffset:point animated: YES];
}
このscrollViewに関する他のすべては期待どおりに機能しますが、 scrollRectToVisible
です。なぜ?!?ワイルドな推測はありますか?
解決
1か月後、ようやくわかりました。上記の代替案はうまく機能したが、それは私を悩ませており、私は最終的にそれを把握しなければならなかった。それはやや愚かな間違いだったことが判明しました。
これは、viewDidLoadにある古いコードです。scrollViewを設定します。
[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];
scrollViewの高さまたは幅の値は0にできません! ScrollViewのサイズは有効なサイズで始まると仮定していましたが、1つの次元がゼロであるという事実を見逃していたため、これは私を通り過ぎたと思います!
これは動作します:
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
これが誰かを助けることを願っています。私は間違いなくこれをデバッグしようとしてあまりにも多くの時間を費やしました。
他のヒント
ええ、私は scrollRectToVisible:animated:
で成功していませんが、 setContentOffset:animated:
は常に機能します。好奇心から、なぜ setContentOffset:animated:
を使用したくないのですか?適切な解決策のようです。
scrollViewの delaysContentTouches
プロパティが NO
に設定されていることを確認してください。
scrollViewのサブビュー内のタッチからメソッド scrollRectToVisible
または setContentOffset
を呼び出すと、タッチを遅らせることでscrollViewが停止する可能性があります。
したがって、必ずscrollViewで以下を設定してください。
scrollView.delaysContentTouches = NO;
ほとんどの場合、YESに設定されたアニメーションの有無に関係なくscrollViewを移動できます。
私はこのようにしていたが、動作しなかった
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);
iは contentSize
の高さを変更するだけだったので、それが問題になるとは思いませんでしたが...
これに変更する必要がありました
scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);
は、 scrollView.contentSize.width
が取得から有効な値に設定されるとは限らないため、特定の値を指定することをお勧めします
" clefScrollView"のフレームを設定していない場合、上記の解決方法でもエラーが発生する可能性があります。
上記の解決策を使用しても同じ問題が発生する場合は、コンテンツビューを設定する前にscollView(この場合はclefScrollView)フレームを初期化してください。
clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
ゲームに少し遅れましたが、私は同じ問題を抱えていました。スクロールビューのコンテンツサイズは絶対に正しく設定されていましたが、高さの値については過度に設定されていました。フレームとコンテンツサイズを検証するための広範なチェックの後でも、まだ機能していませんでした。 「境界」を調整する必要がありました。フレームの高さ、そしてすべてがうまくいきました。
この問題と同じ症状がありました。scrollRectToVisibleが意図したとおりに機能しませんでした。私の問題は、ストーリーボードのスクロールビューにあいまいな制約の問題があったことです。それが修正されると、呼び出しは正常に機能しました。 scrollRectToVisible呼び出しが意図したとおりに機能しない場合は、確認する必要があります。
私にとっての問題は、サブビューの制約が明示的ではないことでした。 レイアウトに明らかに必要ではない場合でも、コンテンツのすべての制約が設定されていることを確認してください。