2014-09-15 4 views
0

Создаю свой пользовательский индикатор загрузки. Итак, я обновляю мой взгляд, как этогоПросмотр остановки анимации после навигации

@property (nonatomic, readonly) CAShapeLayer *progressLayer; 
@property (nonatomic, readwrite) BOOL isAnimating; 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    self.progressLayer.frame = CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)); 
    [self updatePath]; 
} 

- (void)updatePath { 
    CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
    CGFloat radius = MIN(CGRectGetWidth(self.bounds)/2, CGRectGetHeight(self.bounds)/2) - self.progressLayer.lineWidth/2; 
    CGFloat startAngle = 3 * M_PI_2; 
    CGFloat endAngle = self.endAngle; 
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; 
    self.progressLayer.path = path.CGPath; 
} 

Анимация начинается здесь

- (void)startAnimating { 
    if (self.isAnimating) 
    return; 

    CABasicAnimation *animation = [CABasicAnimation animation]; 
    animation.keyPath = @"transform.rotation"; 
    animation.duration = 1.0f; 
    animation.fromValue = @(0.0f); 
    animation.toValue = @(2 * M_PI); 
    animation.repeatCount = INFINITY; 

    [self.progressLayer addAnimation:animation forKey:kLLARingSpinnerAnimationKey]; 
    self.isAnimating = true; 
} 

- (void)stopAnimating { 
    if (!self.isAnimating) 
     return; 

    [self.progressLayer removeAnimationForKey:kLLARingSpinnerAnimationKey]; 
    self.isAnimating = false; 
} 

- (CAShapeLayer *)progressLayer { 
    if (!_progressLayer) { 
     _progressLayer = [CAShapeLayer layer]; 
     _progressLayer.strokeColor = self.tintColor.CGColor; 
     _progressLayer.fillColor = nil; 
     _progressLayer.lineWidth = 1.5f; 
    } 
    return _progressLayer; 
} 

У меня есть панели вкладок приложения, так что проблема при запуске анимации, я нажимаю на другую вкладку, а затем вернуться к первому view, мой пользовательский индикатор не оживляет. Также эта ошибка (функция) появляется в ячейках коллекции, если я добавляю свой индикатор в ячейки. добавить свой индикатор, вызвав простой метод addSubview:

[view addSubview:indicator]; 
[indicator startAnimating]; 

Как я могу предотвратить остановки анимировать после навигации? Спасибо заранее.

+0

Когда вы переходите от одного вида к другому в приложении tabBar, область видимости этого релиза является выпуском, так что объект objet жив. Также основное использование индикатора - дать пользователю понять, что он/она должен дождаться завершения этой услуги/операции, а также вы должны отключить индекс выбора tabBar до завершения индикатора. Отдых все зависит от использования приложения ur. Пользовательский интерфейс предложения является частью приложения. – nikhil84

+0

@ walle84, но почему UIActivityIndicatorView отлично работает и не останавливается? –

+0

У меня не было этой строки «мой пользовательский индикатор не оживляет». Так не оживляет в каком смысле? – nikhil84

ответ

0

Здесь вы идете,

// Я использовал BOOL viewChange, чтобы проверить, если кок был запущен или нет, пока пользователь постучал другой точки зрения в TabBar.

- (void)viewWillAppear:(BOOL)animated{ //On initial run the viewChange will be false and the condition in if won't run but as spinnerView start animating u could change the viewChange flag to true. 

    //So when user will be back from second view then this flag would be true and it will start animating. 

    //As your work is complete then just stop animating and remove from view. 

    if(viewChange){ 
    [spinnerView stopAnimating]; 
    [spinnerView removeFromSuperview]; 
    spinnerView = nil; 
    spinnerView = [[LLARingSpinnerView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 40, 40)]; 

    [self.view addSubview:spinnerView]; 
    [spinnerView startAnimating]; 
    } 
} 

- (void)viewWillDisappear:(BOOL)animated{ 

//This is called when user move from current view to another and at that point we user won't be seeing the spinnerView so remove it and release it only if it's animating. 

    if(spinnerView.isAnimating){ 
    viewChange = YES; 
    [spinnerView stopAnimating]; 
    [spinnerView removeFromSuperview]; 
    spinnerView = nil; 
    } 
    else{ 
    viewChange = NO; 
} 
} 

- (IBAction)stopBtn:(id)sender{  //Spinner is stop animating with tap on button and is removed from the view. 
    if(spinnerView.isAnimating){ 
     [spinnerView stopAnimating]; 
     [spinnerView removeFromSuperview]; 
     spinnerView = nil;    //release the obj of spinnerView. 
    } 
} 

- (IBAction)btnTap:(id)sender{   //Spinner is start animating with tap on button 
    if(!spinnerView) 
    spinnerView = [[LLARingSpinnerView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 40, 40)]; 
    spinnerView.lineWidth = 1.5f; 
    spinnerView.tintColor = [UIColor redColor]; 
    [self.view addSubview:spinnerView]; 

    [spinnerView startAnimating]; 
} 

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

+0

Выглядит большое спасибо! Но у меня есть сомнения относительно ячеек коллекции. Если я добавлю этот счетчик в ячейку, он также прекратит анимацию. Очевидным решением является вызов reloadData в ViewWillAppear. Но я боюсь, что это не очень эффективно. Что вы, @ walle84, думаете об этом? –

+0

Я не согласен на использование счетчика в ячейках и позволяю пользователю перемещаться в другое представление. Поэтому вам нужно заново подумать о части U UU. Также, если вы хотите пойти так, то более подробная информация о ur collectionView даст мне ясное представление об использовании ура, тогда я смогу дать u solution/suggestion. – nikhil84

+0

Я использую spinner в ячейках с ImageView во время загрузки изображений из Интернета. –

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