如何按顺序将子视图添加到 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的主要内容,如果未能解决你的问题,请参考以下文章