UIScrollviewからすべてのサブビューを削除するにはどうすればよいですか?
scrollView
をUIScrollView
のインスタンスとします。
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()
}
スクロールインジケータバーを削除しないように注意してください。
Adam Koによって提供されたコードは短くエレガントですが、水平および垂直スクロールインジケーターを削除する可能性があります。
私はいつもします
for (UIView *v in scrollView.subviews) {
if (![v isKindOfClass:[UIImageView class]]) {
[v removeFromSuperview];
}
}
手動でスクロールに追加されたUIImageViewがないと仮定します。
Ricardo de Cillo'sに加えて、私の場合、削除したいサブビューにimageviewsが含まれるテーブルビューがありました。
for (UIView *v in self.tableview.subviews) {
if ([v isKindOfClass:[UIImageView class]]) {
[v removeFromSuperview];
}
}
の除去! ifコマンドでscrollview
をself.tableview
に変更すると、すべての画像が削除されますが、テーブルビューは変更されません。
Scrollview.subviewsのuiimageviewsを削除し、垂直インジケーターと水平インジケーターも保持したい場合。特別な「タグ」を設定してビューを識別し、デフォルトでタグが0である垂直および水平インジケーターを除外できます。
Swift以前の回答の簡潔なバージョンを補完します(Swift 3.0対応):
_ = scrollView.subviews.filter { $0 is UIImageView }.map { $0.removeFromSuperview() }