提问人:Hash.Techniq 提问时间:9/2/2013 最后编辑:markoHash.Techniq 更新时间:9/2/2013 访问量:400
UIScrollView 占用太多时间
UIScrollView taking too much time
问:
我试图在我的应用程序中放置一个有 1000,000 条记录的 ScrollView,这个 scrollView 将在应用程序启动时加载,所以应用程序直到 1000 000 条记录才运行,这需要很多时间,我想知道有什么方法可以在加载记录时显示应用程序和 scrollView(在添加其记录时显示 scrollView), 在代码下面我使用:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self loadIt];
}
- (void)loadIt{
float startX = 0;
float startY = 0;
[_bigScroll setContentSize:CGSizeMake(320, 312500)];
_bigScroll.pagingEnabled = NO;
for (counter=0; counter<999999; counter++)
{
UIButton *tester=[[UIButton alloc] initWithFrame:CGRectMake(startX, startY, 10, 10)];
if (counter % 2 == 0) {
[tester setBackgroundColor:[UIColor whiteColor]];
}
else
{
[tester setBackgroundColor:[UIColor grayColor]];
}
[_bigScroll addSubview:tester];
[tester release];
if (startX == 320) {
startX = 0;
startY += 10;
}
else
startX += 10;
NSLog(@"counter = %d", counter);
}
}
请指教。
答:
有没有办法在加载记录时显示应用程序和 scrollView?
尝试使用它
,在执行此方法之前,它不会阻止您的 UI。[self performSelector:@selector(loadIt) withObject:nil]; or
[self performSelector:@selector(loadIt) withObject:nil afterDelay:0.2];
您正在加载大量记录。实际上,您不应该一次加载所有记录。您应该使用类似于 tableview 的机制,即仅加载那些位于滚动视图可见区域中的记录。在滚动之前不要加载新行,您应该重用行或视图,以便加快滚动速度。
评论
Apple 的文档非常明确,滚动的视图应该是平铺的,您的应用程序在视图滚动时提供平铺。UIScrollView
管理滚动视图中显示的内容绘制的对象应平铺内容的子视图,以便任何视图都不超过屏幕大小。当用户在滚动视图中滚动时,此对象应根据需要添加和删除子视图。
这对于性能和内存使用都是必需的:可滚动视图由 ,而 又由位图支持。对于创建的每个对象也是如此。CALayer
UIButton
虽然这需要很长时间并不奇怪,但您的应用程序没有因使用过多内存而被终止,这更是一个谜。
和 都是平铺其内容的视图示例。你可能会发现你可以使用其中之一来实现你的要求,如果没有,请遵循他们使用的模型。UITableView
UICollectionView
您不需要创建 1000,000 次观看。您可以动态创建视图并删除在屏幕空间中不可见的先前视图。因此,在滚动时,您可以创建新视图并删除屏幕可见区域之外的视图。 这将帮助您节省内存,否则无论您是否在项目中使用 ARC,如果您在内存中加载了那么多视图,肯定会有崩溃的机会,在这种情况下,ARC 将无济于事。
一旦尝试这个 更改代码
-viewdidload()
{
[self loadIt];//change this to
[self performSelectorInBackground:@selector(loadIt) withObject:nil];
}
评论
-(void) viewDidLoad()
评论