2013-07-16 2 views
1

(Как отменить UIView вращать блок анимация

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 50)]; 
label.layer.cornerRadius = 5.0f; 
label.text = @"hello world"; 
label.textAlignment = NSTextAlignmentCenter; 
[self.view addSubview:label]; 
[label release]; 
[self startAnimation]; 

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
btn.frame = CGRectMake(0, 0, 60, 30); 
[btn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:btn]; 
} 

- (void)startAnimation 
{ 
CGAffineTransform transForm = CGAffineTransformMakeRotation(angel * M_PI/180.0f); 
[UIView animateWithDuration:0.1f delay:0.0f options:UIViewAnimationOptionCurveLinear animations:^(void){ 
    label.transform = transForm; 
} completion:^(BOOL finished) { 
    NSLog(@"1"); 
    angel = angel + 5; 
    [self startAnimation]; 
}]; 
} 

- (void)btnPressed:(id)sender 
{ 
    //method 1 :[label.layer removeAllAnimations]; not work... 
//method 2 : CGAffineTransform transForm = CGAffineTransformMakeRotation(M_PI/180.0f); 
//label.transform = transForm;  not work... 
} 

)

я повернуть этикетку, теперь я хочу, чтобы отменить его, я искал возможные вопросы в месте, и нашел около двух решений , Я попытался, но два решения не работают.

+0

Вы также можете повернуть назад в тот же угол. Например: если вы повернули +180, а затем поверните его снова на -180 ..: P – HDdeveloper

ответ

1

Анимация не прекращается, когда вы используете [label.layer removeAllAnimations], потому что вы вызываете [self startAnimation] независимо от значения переменной finished. Это приводит к продолжению анимации, даже если вы отменили ее.

Вы должны изменить свой блок завершения анимации к следующему:

- (void)startAnimation 
{ 
    CGAffineTransform transForm = CGAffineTransformMakeRotation(angel * M_PI/180.0f); 
    [UIView animateWithDuration:0.1f delay:0.0f options:UIViewAnimationOptionCurveLinear  animations:^(void){ 
    label.transform = transForm; 
    } completion:^(BOOL finished) { 
    if (finished) { 
     NSLog(@"1"); 
     angel = angel + 5; 
     [self startAnimation]; 
    } 
    }]; 
} 

Использование [label.layer removeAllAnimations] в btnPressed

+0

да, это сработало.Спасибо! Я напечатал «законченное» значение bool, это 0, когда я нажимаю кнопку.Я смотрю параметр " завершение ". Документы говорят так:« Блок-объект, который должен быть выполнен, когда последовательность анимации заканчивается. Этот блок не имеет возвращаемого значения и принимает один логический аргумент, который указывает, действительно ли анимация была закончена до того, как был вызван обработчик завершения. Если продолжительность анимации равна 0, этот блок выполняется в начале следующего цикла цикла цикла. Этот параметр может быть NULL. " Я думаю, что операция removeAllAnimations делает анимацию законченной – frank

Смежные вопросы