UIScrollViewを更新/再読み込みするための最良の方法
ScrollViewにいくつかのサブビュー(画像/ボタン)を追加するメソッドがあります。
重要なのは、ユーザーはScrollViewの外部から、ScrollViewのコンテンツを変更するボタンをタップできるということです。
ScrollViewを「リセット」するための適切な方法は次のとおりですか。
for (UIView * view in myScrollView.subViews) {
[view removeFromSuperview];
}
このソリューションでは、ScrollView上の位置を示すためにバーが削除されることに注意してください
setNeedsDisplay
を呼び出すと、スクロールビューが再描画されるだけで、実際にはその中のコンテンツが削除されません。
ご存知のように、すべてのスクロールビューサブビューでremoveFromSuperview
を呼び出すと、スクロールバーも削除されることがあります(あまり良くありません)。
これにはいくつかのアプローチがあります。1つは、自分でスクロールビューに追加したすべてのビューを含む個別の配列を維持することです。その後、代わりにこの配列を反復処理できます。私の見解では、これがおそらく最良のアプローチです。
もう1つの少しハッキーな方法は、ビューを反復処理しながらビューをテストすることです。
for (UIView *view in self.contentView.subviews)
{
if (![view isKindOfClass:[UIImageView class]])
[view removeFromSuperview];
}
スクロールバー自体はUIImageView
サブクラスであるため、スクロールバーは削除されません。ただし、繰り返しになりますが、自分で画像ビューを使用している場合は、画像ビューも削除されず、将来のiOSバージョンで画像ビューのままになる保証はありません。
私の最初のアプローチを採用し、追加したすべてのビューを配列に保持する方がはるかに優れています。
これは一種の古いスレッドですが、少し簡単な方法は、ビューにタグを追加して、UIScrollViewに追加することです(たとえば15)。
for (UIView * view in _scrollView.subviews) {
if (view.tag == 15) {
[view removeFromSuperview];
}
}
このようにして、追加したビューのみが確実に削除されるようにすることができます。ちょっとした考え。
私は通常、scrollviewに配置したビューの個別の変更可能な配列を保持し、subviews
の代わりにそれを繰り返し処理します。そうすれば、自分が入れたものだけを取り出します。しかし、基本的なアプローチは同じです。
スクロールバーを除くすべてのサブビューを削除するために行ったことは次のとおりです。frame.size.widthが10より大きいすべてのサブビューを削除したので、スクロールバーの幅は10より小さいため、削除されません。これは、UIScollViewに追加するすべてのビューの幅が10より大きいことを前提としています。
for (UIView * view in view.subviews) {
if(view.frame.size.width > 10){ // removes all component except scrollbar
[view removeFromSuperview];
}
}
不要なビュー(回避できないと想定しています)を削除したら、[myScrollView setNeedsDisplay];
を呼び出して、次の描画サイクルでUIScrollViewを更新します。
スクロールメソッドを開始する前にこの行を設定する必要があります。スクロールビューからすべてのデータを削除するだけで、メソッドに従ってスクロールビューがリセットされます。
NSArray* subviews = [[NSArray alloc] initWithArray: Main_Scroll.subviews];
for (UIView* view in subviews)
{
if ([view isKindOfClass:[UIView class]])
{
[view removeFromSuperview];
}
if ([view isKindOfClass:[UIImageView class]])
{
[view removeFromSuperview];
}
if ([view isKindOfClass:[UIButton class]])
{
[view removeFromSuperview];
}
if ([view isKindOfClass:[UILabel class]])
{
[view removeFromSuperview];
}
}