web-dev-qa-db-ja.com

UIScrollViewを更新/再読み込みするための最良の方法

ScrollViewにいくつかのサブビュー(画像/ボタン)を追加するメソッドがあります。

重要なのは、ユーザーはScrollViewの外部から、ScrollViewのコンテンツを変更するボタンをタップできるということです。

ScrollViewを「リセット」するための適切な方法は次のとおりですか。

for (UIView * view in myScrollView.subViews) {
    [view removeFromSuperview];
}

このソリューションでは、ScrollView上の位置を示すためにバーが削除されることに注意してください

13
Andre Cytryn

setNeedsDisplayを呼び出すと、スクロールビューが再描画されるだけで、実際にはその中のコンテンツが削除されません。

ご存知のように、すべてのスクロールビューサブビューでremoveFromSuperviewを呼び出すと、スクロールバーも削除されることがあります(あまり良くありません)。

これにはいくつかのアプローチがあります。1つは、自分でスクロールビューに追加したすべてのビューを含む個別の配列を維持することです。その後、代わりにこの配列を反復処理できます。私の見解では、これがおそらく最良のアプローチです。

もう1つの少しハッキーな方法は、ビューを反復処理しながらビューをテストすることです。

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

スクロールバー自体はUIImageViewサブクラスであるため、スクロールバーは削除されません。ただし、繰り返しになりますが、自分で画像ビューを使用している場合は、画像ビューも削除されず、将来のiOSバージョンで画像ビューのままになる保証はありません。

私の最初のアプローチを採用し、追加したすべてのビューを配列に保持する方がはるかに優れています。

19
lxt

これは一種の古いスレッドですが、少し簡単な方法は、ビューにタグを追加して、UIScrollViewに追加することです(たとえば15)。

for (UIView * view in _scrollView.subviews) {
    if (view.tag == 15) {
        [view removeFromSuperview];
    }
}

このようにして、追加したビューのみが確実に削除されるようにすることができます。ちょっとした考え。

3
WiseOlMan

私は通常、scrollviewに配置したビューの個別の変更可能な配列を保持し、subviewsの代わりにそれを繰り返し処理します。そうすれば、自分が入れたものだけを取り出します。しかし、基本的なアプローチは同じです。

2
Rob Napier

スクロールバーを除くすべてのサブビューを削除するために行ったことは次のとおりです。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];
    }
}
1
krisrak

不要なビュー(回避できないと想定しています)を削除したら、[myScrollView setNeedsDisplay];を呼び出して、次の描画サイクルでUIScrollViewを更新します。

0
Matisse VerDuyn

スクロールメソッドを開始する前にこの行を設定する必要があります。スクロールビューからすべてのデータを削除するだけで、メソッドに従ってスクロールビューがリセットされます。

       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];
            }
        }
0