刷新/重新加载UIScrollView的最佳方法

时间:2012-02-09 19:55:34

标签: iphone objective-c uiscrollview

我有一个方法可以将一些子视图(图像/按钮)添加到我的ScrollView。

事实是,从ScrollView外部,用户可以点击一个按钮来改变ScrollView的内容。

是否有更好的方法来“重置”ScrollView,而不是:

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

请注意,此解决方案会删除条形以指示ScrollView上的位置

6 个答案:

答案 0 :(得分:19)

调用setNeedsDisplay只是重绘滚动视图,而不是实际删除其中的内容。

正如您所发现的那样,在所有滚动视图子视图上调用removeFromSuperview会导致滚动条有时也被删除(不太好)。

围绕这个有几种方法:第一种方法是维护一个包含您自己添加到滚动视图中的所有视图的不同数组。然后,您可以改为遍历此数组。在我看来,这可能是最好的方法。

另一种稍微笨拙的方法是在迭代它们时测试视图:

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

因为滚动条本身是UIImageView子类,所以不会删除它们。但话说回来,如果您自己使用图像视图,它们也不会被删除,并且在将来的iOS版本中无法保证它们将保留图像视图。

使用我的第一种方法更好,只需保留一个数组,并添加您添加的所有视图。

答案 1 :(得分:3)

这是一个旧线程,但稍微简单一点的方法可能就是在视图中添加一个标记,即添加到UIScrollView中,假设为15.然后

for (UIView * view in _scrollView.subviews) {
    if (view.tag == 15) {
        [view removeFromSuperview];
    }
}
通过这种方式,您可以确保只删除了已添加的视图。 只是一个想法。

答案 2 :(得分:2)

我通常保留一个单独的可变数组视图,我已将其放入scrollview中,并迭代而不是subviews。这样我只能拿出我放入的东西。但基本方法是一样的。

答案 3 :(得分:1)

以下是我删除滚动条以外的所有子视图,删除了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];
    }
}

答案 4 :(得分:0)

删除任何不需要的视图(我假设你无法解决)请在下一个绘图周期调用[myScrollView setNeedsDisplay];刷新UIScrollView。

答案 5 :(得分:0)

您必须在开始滚动方法之前设置此行,它只是从scrollview中删除所有数据,并根据您的方法,scrollview将重置。

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