最近发现想用苹果自带的动画函数来添加多个控件并且让它们一个接一个的显示出来是很困难的,因为自带的动画函数每次都是把我需要的动画或者控件一次性创建完再显示成动画的。下面的代码就是遇到了这样的情况,不能每次加载一个新的控件就立即显示出来,而是全部加载完了一起显示的。
- (void)add{
for (int i = 0; i<10; i++) {
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(120, 20*i+30, 80, 15)];
button.backgroundColor = [UIColor redColor];
[button setTitle:@"asd" forState:UIControlStateNormal];
[self.view addSubview:button];
[NSThread sleepForTimeInterval:0.5f];//延时0.5s
NSLog(@"other i:%d",i);
}
}
经过多方面的搜集资料,现在总结了一个方法可以实现这个功能。
首先我们要用到多线程,先说一下什么是线程,个人的理解是:凡是一个正在运行的程序都处在一个线程上。而大多数程序都只用到一个线程。如果学过单片机的话我觉得和单片机里面的中断有些相似,都是在主程序中运行的时候跳转出来去执行其他函数。我们现在要做的就是在主线程中新开辟一个线程,把我们要生成的新的控件或者UIView不在主线程中生成,而是我们新开辟一个线程并且在新的线程中生存需要成为动画的控件。大家看一下下面的代码
- (void)add{
for (int i = 0; i<10; i++) {
NSLog(@"first i:%d",i);
[NSThread detachNewThreadSelector:@selector(add2:i) toTarget:self withObject:nil];
[NSThread sleepForTimeInterval:0.5f];//延时0.5s
NSLog(@"other i:%d",i);
}
}
- (void)add2:(int)i
{
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(120, 20*i+30, 80, 15)];
button.backgroundColor = [UIColor redColor];
[button setTitle:@"asd" forState:UIControlStateNormal];
[self.view addSubview:button];
}
大家注意到没有本来只有一个函数的现在拆分成两个函数了。我把for循环里的创建控件的程序段移出来重新建了个函数add2,并且在原来的for循环里面添加了一句通过线程调用添加对象的语句:[NSThread detachNewThreadSelector:@selector(add2:i) toTarget:self withObject:nil];
这样每次创建新对象就不在主线程的内存中了,而是在新的线程里面创建对象并且能立马显示出来,连续创建多个再配合延时函数就能成为一桢桢动画了。
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/2930.html
微信打赏
支付宝打赏
感谢您对作者Bear的打赏,我们会更加努力! 如果您想成为作者,请点我