2014-12-09 2 views
0

Я использую анимацию UIView, чтобы настроить «экран загрузки», а затем отключить экран загрузки после завершения NSURLSessionDataTask. Приведенный ниже код в идеале бы нарисовать прямоугольник подвид на одноцветные фоне, а затем повернуть и перевести этот прямоугольный подвид, пока DataTask не выполнит его завершение блока:анимация UIView с длительностью намного быстрее, чем указано

void getData() 
{ 
    .... 
    NSURLSessionDataTask *dataTask = [sharedSessionMainQueue dataTaskWithRequest:req 
            completionHandler: ^(NSData *data, 
            NSURLResponse *response, NSError *error){ 

     NSMutableArray *jsonObject = [NSJSONSerialization JSONObjectWithData:data 
                     options:0 
                     error:nil]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      ... 
      [UIView animateWithDuration:10 animations:^{ 
       [_ballView removeFromSuperview]; 
       [_tempview removeFromSuperview]; 
      }]; 

     }]; 

     [self.view addSubview:_tempview]; 
     _ballView = [[UIView alloc] initWithFrame:CGRectMake(_width/2 - 10, _height*.9, 10.0f, 80.0f)]; 
     _ballView.center = CGPointMake(_width*.5, _height*.3); 
     _ballView.backgroundColor = BACKGROUND_COLOR; //[UIColor orangeColor]; 
     [self.view addSubview: _ballView]; 

     CGFloat angleToRotate = 20*M_PI; 

     [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionAutoreverse animations:^{ 
      [UIView setAnimationRepeatCount:100]; 
      CGRect f = _ballView.frame; 
      f.origin.y = _height*.1; 
      _ballView.frame = f; 
      _ballView.transform = CGAffineTransformMakeRotation(angleToRotate); 

     } completion:nil]; 

     [dataTask resume]; 
    } 

} 

Но у меня есть две проблем. Сначала анимация завершается очень быстро - гораздо меньше секунды - независимо от того, какую продолжительность я укажу в любом из блоков анимации. Во-вторых, блок переводит, но он не вращается.

Любые идеи о том, что происходит? Что-то напуганное происходит с анимацией UIView внутри блоков завершения?

Спасибо!

+0

Пожалуйста, вы можете исправить форматирование кода, я не могу видеть, где блок dispatch_async предназначен для закрытия – Nick

+0

@Lyndsey спасибо за форматирование! –

ответ

3

Первая анимация блока (с вызовами removeFromSuperview) завершится почти сразу, потому что removeFromSuperview не является анимированным. Вы должны использовать что-то некоторые любят

[UIView animateWithDuration:10 animations:^{ 
    _ballView.alpha = 0; 
    _tempview.alpha = 0; 
} completion:^(BOOL finished) { 
    [_ballView removeFromSuperview]; 
    [_tempview removeFromSuperview]; 
}]; 

Проблема во втором блоке, является то, что вам нужно преобразовать градусы в радианы, но в любом случае, это не работает, потому что он будет вращаться с тем же углом старта. Вы должны использовать NSTimer, или намного проще и лучше - CAAnimation:

CABasicAnimation* rotationAnimation; 
CGFloat duration = 2, repeat = 50; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 * duration ]; 
rotationAnimation.duration = duration; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = repeat; 

[view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
+0

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

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