如何按顺序将子视图添加到 UIScrollView

Posted

技术标签:

【中文标题】如何按顺序将子视图添加到 UIScrollView【英文标题】:How to add subviews to UIScrollView sequentially 【发布时间】:2012-01-12 19:46:55 【问题描述】:

我在将子视图按顺序添加到滚动视图时遇到问题。

我从服务器返回了一个 JSON 响应,我将其解析为一个业务对象数组,然后发送到函数 updateCarousel,如下所示:

-(void) updateCarousel: (NSArray *)response
    if(response && response.count>0)
        int i=0;
        self.scrollView.hidden=NO;
        [self.scrollView setNeedsDisplay];
        self.pageControl.hidden=NO;

        [self.scrollView setContentOffset:CGPointMake(0, 0) animated:NO];

        for (Business *business in response) 
            if (i >= MAX_INITAL_SEARCH_RESULTS)
                 break;

        CGRect frame;
        frame.origin.x = self.scrollView.frame.size.width * i;
        frame.origin.y = 0;

        frame.size = scrollView.frame.size;

        CardView *cardView = [[CardView alloc] initWithBusinessData:business andFrame:frame];


        //I've tried the following code with and without wrapping it in a GCD queue
        dispatch_queue_t addingQueue = dispatch_queue_create("adding subview queue", NULL);
        dispatch_async(addingQueue, ^
            [self.scrollView addSubview:cardView];
        );
        dispatch_release(addingQueue);

        cardView.backgroundColor = [UIColor colorWithWhite:1 alpha:0];            
        i++;

        self.scrollView.contentSize = CGSizeMake(i*(self.scrollView.frame.size.width), self.scrollView.frame.size.height);
        self.pageControl.numberOfPages=i;

    
else
    self.scrollView.hidden=YES;
    self.pageControl.hidden=YES;
    NSLog(@"call to api returned a result set of size 0");

结果——尽管我尝试了很多东西——总是一样的:滚动视图一次添加所有子视图,而不是通过循环处理它们。我不明白这怎么可能。如果我在循环末尾添加一个 sleep() ,它会以某种方式等待整个循环结束,然后再显示添加的子视图。它怎么知道结果数组有多长?我无能为力,请帮忙。

【问题讨论】:

【参考方案1】:

我假设您没有使用任何额外的线程来处理数据。 您遇到的是应用程序在执行您的方法时卡住了。即使您一个一个地添加子视图(它们之间有一个睡眠),也不会执行其他代码来处理您的添加。

1。您可以使用另一个线程来加载数据并添加子视图,但这需要同步到主线程(更复杂)。

2 您可以在多次调用中中断您的方法。在两次调用 load 方法之间,允许执行其他代码,这意味着滚动视图将能够一一处理/显示您的子视图。

您需要将加载方法更改为以下内容:


- (void)updateCarouselStep:(NSNumber*)loadIndex

    if (response && response.count > 0)
    
        // Here add only a subview corresponding to loadIndex


        // Here we schedule another call of this function if there is anything 
        if (loadIndex < response.count - 1)
        
            [self performSelector:@selector(updateCarouselStep:) withObject:[NSNumber numberWithInt:(loadIndex+1) afterDelay:0.5f];
        
    




这只是问题的一种基本解决方案。例如,您需要考虑在完成加载前一个数据之前更新response 数据会发生什么。

【讨论】:

以上是关于如何按顺序将子视图添加到 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

以网格模式在 UIScrollView 中添加子视图

UIScrollView 在视图出现之前不会接受子视图

将子视图布局锚设置为 UIScrollView

向 UIScrollView 添加多个子视图

iOS 7 - UIScrollView subView 不显示

将子视图添加到视图控制器时,ScrollView 不滚动