動(dòng)畫。定時(shí)器
1.視圖移動(dòng)
{
//在這里定義全局變量也可以,屬性不能聲明在主文件
UIView *_view1;
//標(biāo)記view1是否正在移動(dòng)
BOOL isMoving;
}
//屬性如果不在.h文件中聲明, @property 在這里聲明的屬性,本類可以調(diào)用,在其他類中,不能調(diào)用
//@property (nonatomic,assign)int age;
//方法不在.h文件中聲明,在這里聲明的方法,本類可以調(diào)用,在其他類中,不能調(diào)用
//-(void)eat;
- (void)viewDidLoad {
[super viewDidLoad];
//寫方塊
_view1= [[UIView alloc] initWithFrame:CGRectMake(20, 20, 40, 40)];
_view1.backgroundColor= [UIColor orangeColor];
[self.view addSubview:_view1];
//用tag標(biāo)記視圖view1的運(yùn)動(dòng)狀態(tài),0表示停止或者將要停止?fàn)顟B(tài),1表示運(yùn)動(dòng)狀態(tài)
_view1.tag= 0;
//用isMoving標(biāo)記view1的運(yùn)動(dòng)狀態(tài),NO表示已經(jīng)停止,YES表示還沒停止(動(dòng)畫還在執(zhí)行)
isMoving=NO;
}
//XIB疤坝。點(diǎn)擊開始按鈕調(diào)用的方法
-? (IBAction)start:(id)sender{
//bug1:如果連續(xù)點(diǎn)擊兩次開始按鈕,會(huì)同時(shí)執(zhí)行兩個(gè)動(dòng)畫,而且兩個(gè)動(dòng)畫執(zhí)行的對象都是view1,所以發(fā)生干涉,造成混亂的現(xiàn)象
//解決方法:在點(diǎn)開始按鈕時(shí),判斷一下view1的運(yùn)動(dòng)狀態(tài),tag值為0并不能保證動(dòng)畫已經(jīng)結(jié)束,而isMoving = NO,可以確認(rèn)動(dòng)畫已經(jīng)停止
//bug2:連續(xù)點(diǎn)擊開始和暫停按鈕會(huì)出現(xiàn)干涉
//解決方法:isMoving
if(isMoving==NO) {
//改變view1的運(yùn)動(dòng)狀態(tài)
_view1.tag= 1;
isMoving=YES;
[self move1];
}
}
- (void)move1 {
//如果tag值為1,表示正在運(yùn)動(dòng),則執(zhí)行動(dòng)畫
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,表示現(xiàn)在是停止?fàn)顟B(tài),跳出循環(huán),不在執(zhí)行動(dòng)畫,動(dòng)畫結(jié)束
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];
}
//點(diǎn)擊停止按鈕調(diào)用的方法
- (IBAction)stop:(id)sender {
//把tag值改為0,表示不需要再移動(dòng)了
_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];
}
//視圖移動(dòng)的方法
- (void)viewMove {
//_view1.center = CGPointMake(100, 100);
//讓view1向下移動(dòng)
/* //寫法1
//獲取view1的橫縱坐標(biāo)
float y = _view1.frame.origin.y;
float x = _view1.frame.origin.x;
//讓改變橫縱坐標(biāo)
//x = arc4random()%320;
//y = arc4random()%480;
y ++;
x ++;
//邊界判斷
//重用原理:當(dāng)視圖移動(dòng)到屏幕底端時(shí),我們把它拿到屏幕頂端,繼續(xù)下落
if (x == 320) {
x = -50;
}
if (y == 480) {
//從邊界外滑進(jìn)來比較自然
y = -50;
}
//重新定義view1的位置
//_view1.frame.size.width可以換成固定數(shù)字,但不方便改變,邏輯也比較不嚴(yán)謹(jǐn)
_view1.frame = CGRectMake(x, y, _view1.frame.size.width, _view1.frame.size.height);
*/
/* ?//寫法2
//獲取view1的frame
//CGRect結(jié)構(gòu)體不用*
//rect中間變量可識別
CGRect rect = _view1.frame;
//改變矩形的坐標(biāo)
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;
*/
//定義橫縱坐標(biāo)的變化值
static int a = 3;
static int b = 4;
//獲取小球中心的橫縱坐標(biāo)
intx =_view1.center.x;
inty =_view1.center.y;
//改變橫縱坐標(biāo)
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);
}