UIView自带动画
UIView *view1=[[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
view1.tag=100;
view1.backgroundColor=[UIColor orangeColor];
[self.window addSubview:view1];
//打开动画
[UIView beginAnimations:nil context:Nil];
//设置动画总时间
[UIView setAnimationDuration:5];
//设置动画开始和结束减速
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//设置过滤效果,第二个参数填写父视图的View
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.window cache:YES];
view1.backgroundColor=[UIColor blueColor];
view1.frame=CGRectMake(20, 100, 200, 200);
//设置代理
[UIView setAnimationDelegate:self];
//设置动画完成后调用的方法
[UIView setAnimationDidStopSelector:@selector(stopAnimate)];
/******************************/
/*
UIView自带动画实际是在程序运行的进程中,有主线程创建了
一个副线程,由这个副线程来完成动画。上述设置动画完成后调用的方法,
其实质就是使用了代理的回调。(代理的作用就是 正向传值 和 反向传值)
回调就是反向传值。因为主线程并不知道副线程什么时候完成动画,所以副线程成为了委托方,主线程成为了代理方。当动画完成后,会调用副线程中协议中的AnimationDidStop,而主线程中在实现这个方法中调用了一个新的方法来处理数据。( [UIView setAnimationDidStopSelector:@selector(stopAnimate)];就是在主线程中设置了一个新的方法,来处理数据。)
实际开发中使用最多的时候,还是代理回调,比如 副线程去下载图片,主线程获取图片,然后再处理图片数据
当然回调这个感念并不是OC中第一次出现的,函数回调早在C++中就早已被使用,JAVA中也有,OC只是沿用了这些语言的优点。回调函数,其实和嵌入式中的定时器中端函数,很类似。生活中也常常存在这样的例子。比如:老爸叫儿子出去买瓶酱油,然后儿子出去买酱油,老爸接着洗菜,切菜,做饭(并不会停下来等儿子买完酱油再做这些事),当儿子买完酱油后,敲门,告诉老爸,酱油买回来了,然后把酱油交给老爸。老爸在往菜里加酱油(使用数据)。
*/
/******************************/
//提交动画
[UIView commitAnimations];
[self.window makeKeyAndVisible];
return YES;
}
-(void)stopAnimate
{
UIView *view=[self.window viewWithTag:100];
//打开动画
[UIView beginAnimations:nil context:Nil];
//设置动画总时间
[UIView setAnimationDuration:5];
view.backgroundColor=[UIColor redColor];
//提交动画
[UIView commitAnimations];
}
Block动画
// 使用UIView自带动画
// [UIView beginAnimations:Nil context:nil];
// [UIView setAnimationDuration:1];
// [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
//
// [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交换两个子视图
// [UIView commitAnimations];
//使用block动画
//01 普通block动画
// [UIView animateWithDuration:1 animations:^{
// [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
// [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交换两个子视图
// }];
//02 带有回调的block动画
// [UIView animateWithDuration:1 animations:^{
// [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.window cache:YES];
// [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交换两个子视图
//
// } completion:^(BOOL finished){
// NSLog(@"动画完成");
//
// }];
//03 带有动画效果的block动画,
[UIView transitionWithView:self.window duration:2.0 options:UIViewAnimationOptionTransitionCurlUp animations:^{
[self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //交换两个子视图
} completion:^(BOOL finished) {
}];