动画。定时器
1.视图移动
{
//在这里定义全局变量也可以,属性不能声明在主文件
UIView *_view1;
//标记view1是否正在移动
BOOL isMoving;
}
//属性如果不在.h文件中声明, @property 在这里声明的属性,本类可以调用,在其他类中,不能调用
//@property (nonatomic,assign)int age;
//方法不在.h文件中声明,在这里声明的方法,本类可以调用,在其他类中,不能调用
//-(void)eat;
- (void)viewDidLoad {
[super viewDidLoad];
//写方块
_view1= [[UIView alloc] initWithFrame:CGRectMake(20, 20, 40, 40)];
_view1.backgroundColor= [UIColor orangeColor];
[self.view addSubview:_view1];
//用tag标记视图view1的运动状态,0表示停止或者将要停止状态,1表示运动状态
_view1.tag= 0;
//用isMoving标记view1的运动状态,NO表示已经停止,YES表示还没停止(动画还在执行)
isMoving=NO;
}
//XIB。点击开始按钮调用的方法
- (IBAction)start:(id)sender{
//bug1:如果连续点击两次开始按钮,会同时执行两个动画,而且两个动画执行的对象都是view1,所以发生干涉,造成混乱的现象
//解决方法:在点开始按钮时,判断一下view1的运动状态,tag值为0并不能保证动画已经结束,而isMoving = NO,可以确认动画已经停止
//bug2:连续点击开始和暂停按钮会出现干涉
//解决方法:isMoving
if(isMoving==NO) {
//改变view1的运动状态
_view1.tag= 1;
isMoving=YES;
[self move1];
}
}
- (void)move1 {
//如果tag值为1,表示正在运动,则执行动画
if(_view1.tag== 1) {
[UIViewbegin Animations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(move2)];
_view1.center=CGPointMake(280, 40);
// 4,提交
[UIView commitAnimations];
}
//tag值为0,表示现在是停止状态,跳出循环,不在执行动画,动画结束
else{
isMoving=NO;
}
}
- (void)move2 {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
_view1.center=CGPointMake(280, 440);
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(move3)];
[UIView commitAnimations];
}
- (void)move3 {
[UIView beginAnimations:nilcontext:nil];
[UIView setAnimationDuration:1];
_view1.center=CGPointMake(40, 440);
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(move4)];
[UIView commitAnimations];
}
- (void)move4 {
[UIView beginAnimations:nil context:nil];
[UIViewset AnimationDuration:1];
_view1.center=CGPointMake(40, 40);
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(move1)];
[UIView commitAnimations];
}
//点击停止按钮调用的方法
- (IBAction)stop:(id)sender {
//把tag值改为0,表示不需要再移动了
_view1.tag= 0;
}
@end
//小球弹跳
{
UIView *_view1;
}
- (void)viewDidLoad {
[super viewDidLoad];
_view1 = [[UIView alloc] initWithFrame:CGRectMake(160, 0, 30, 30)];
_view1.backgroundColor= [UIColorgreenColor];
_view1.layer.cornerRadius= 15;
_view1.alpha= 0.5;
[self.view addSubview:_view1];
[NSTimer scheduledTimerWithTimeInterval:0.01 target:selfselector:@selector(viewMove) userInfo:nil repeats:YES];
}
//视图移动的方法
- (void)viewMove {
//_view1.center = CGPointMake(100, 100);
//让view1向下移动
/* //写法1
//获取view1的横纵坐标
float y = _view1.frame.origin.y;
float x = _view1.frame.origin.x;
//让改变横纵坐标
//x = arc4random()%320;
//y = arc4random()%480;
y ++;
x ++;
//边界判断
//重用原理:当视图移动到屏幕底端时,我们把它拿到屏幕顶端,继续下落
if (x == 320) {
x = -50;
}
if (y == 480) {
//从边界外滑进来比较自然
y = -50;
}
//重新定义view1的位置
//_view1.frame.size.width可以换成固定数字,但不方便改变,逻辑也比较不严谨
_view1.frame = CGRectMake(x, y, _view1.frame.size.width, _view1.frame.size.height);
*/
/* //写法2
//获取view1的frame
//CGRect结构体不用*
//rect中间变量可识别
CGRect rect = _view1.frame;
//改变矩形的坐标
rect.origin.y ++;
rect.origin.x ++;
//边界判断
if (rect.origin.x >=320) {
rect.origin.x = -50;
}
if (rect.origin.y >= 480) {
rect.origin.y = -50;
}
//重新定义view1的位置
_view1.frame = rect;
*/
//定义横纵坐标的变化值
static int a = 3;
static int b = 4;
//获取小球中心的横纵坐标
intx =_view1.center.x;
inty =_view1.center.y;
//改变横纵坐标
x += a;
y += b;
//边界判断
if(x >= 305) {
a = -3;
}
if(x <= 15) {
a = 3;
}
if(y >=465) {
b = -4;
}
if(y <=15) {
b = 4;
}
//刷新位置
_view1.center=CGPointMake(x, y);
}