【问题标题】:Best way to refresh/reload UIScrollView刷新/重新加载 UIScrollView 的最佳方法
【发布时间】:2012-03-02 07:57:25
【问题描述】:

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

问题是,用户可以从 ScrollView 外部点击一个按钮,该按钮将更改 ScrollView 的内容。

有没有比“重置”ScrollView更好的方法:

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

请注意,此解决方案移除了指示 ScrollView 上位置的栏

【问题讨论】:

    标签: iphone objective-c uiscrollview


    【解决方案1】:

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

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

    有几种方法可以解决这个问题:第一种是维护一个不同的数组,其中包含您自己添加到滚动视图中的所有视图。然后,您可以只迭代这个数组。在我看来,这可能是最好的方法。

    另一种略显老套的方法是在遍历视图时对其进行测试:

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

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

    使用我的第一种方法要好得多,只需保留一个包含您添加的所有视图的数组。

    【讨论】:

    • 当然这是一个更好的主意,以前从未想过...为了让其他有相同问题的人清楚:当您将子视图添加到您的滚动视图时,也将其添加到数组中.当您看到需要删除它们时,在数组中迭代并只向它们发送消息 removeFromSuperview。
    【解决方案2】:

    这是一种旧线程,但稍微简单一点的方法可能是在视图中添加一个标签,即您添加到 UIScrollView,比如说 15。然后

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

    这样您就可以确保只有您添加的视图会被删除。 只是一个想法。

    【讨论】:

      【解决方案3】:

      我通常会保留一个单独的可变视图数组,并将其放入滚动视图中,并对其进行迭代,而不是 subviews。这样我只取出我放入的东西。但基本方法是一样的。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 并且不要忘记在调用[myScrollView setNeedsDisplay];[myScrollView setNeedsLayout];之前调用[myScrollView setContentSize:size];来更新UIScrollView的内容大小
          • 查看这个 SO 问题:stackoverflow.com/questions/2156015/iphone-remove-all-subviews 建议使用 [[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 作为删除所有子视图的简化方法。
          • 我刚刚意识到:“请注意,此解决方案移除了指示 ScrollView 上的位置的栏” ...为什么不将 UIScrollView 放在 UIView 内,并简单地删除 UIScrollView 并创建一个新的并重新填充它? (如果您仍然打算删除所有子视图)
          • 我想到了,但那是更多的代码。数组解决方案更适合我。
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2021-08-02
            • 1970-01-01
            • 2019-01-29
            • 2015-07-31
            • 1970-01-01
            • 2013-06-23
            • 2012-12-17
            • 2010-12-03
            相关资源
            最近更新 更多