web-dev-qa-db-ja.com

UIScrollViewからすべてのサブビューを削除しますか?

UIScrollviewからすべてのサブビューを削除するにはどうすればよいですか?

46
Moshe

scrollViewUIScrollViewのインスタンスとします。

Objective-Cでは、それは非常に簡単です。 makeObjectsPerformSelector:を呼び出すだけです:

Objective-C:

[scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

Swiftでは、ランタイムアクセスを取得できないため、実際に反復を処理する必要があります。

Swift:

簡潔なバージョン ここから

scrollview.subviews.map { $0.removeFromSuperview() }

これを行うためのより記述的な方法( here から)は、scrollview.subviewsを想定しています:

let subviews = self.scrollView.subviews
for subview in subviews{
    subview.removeFromSuperview()
}
123
koo

スクロールインジケータバーを削除しないように注意してください。

Adam Koによって提供されたコードは短くエレガントですが、水平および垂直スクロールインジケーターを削除する可能性があります。

私はいつもします

for (UIView *v in scrollView.subviews) {
  if (![v isKindOfClass:[UIImageView class]]) {
    [v removeFromSuperview];
  }
}

手動でスクロールに追加されたUIImageViewがないと仮定します。

34

Ricardo de Cillo'sに加えて、私の場合、削除したいサブビューにimageviewsが含まれるテーブルビューがありました。

for (UIView *v in self.tableview.subviews) {
  if ([v isKindOfClass:[UIImageView class]]) {
    [v removeFromSuperview];
  }
}

の除去! ifコマンドでscrollviewself.tableviewに変更すると、すべての画像が削除されますが、テーブルビューは変更されません。

2
mylogon

Scrollview.subviewsのuiimageviewsを削除し、垂直インジケーターと水平インジケーターも保持したい場合。特別な「タグ」を設定してビューを識別し、デフォルトでタグが0である垂直および水平インジケーターを除外できます。

1
Chiakie

Swift以前の回答の簡潔なバージョンを補完します(Swift 3.0対応):

_ = scrollView.subviews.filter { $0 is UIImageView }.map { $0.removeFromSuperview() }
0
Gui Moura