2013-03-06 3 views
0

В настоящее время я создаю плагин UI. Этот плагин имеет 2 изображения с одним над другим.UIView Анимация не работает, когда добавлен счетчик?

Когда пользователь нажимает на экран: если салфетка больше порога, переднее изображениеView покидает экран в том же направлении, что и салфетки, а затем появляется за обратным изображением.

Таким образом, мы планируем использовать это для очереди изображений. После успешного прокрутки переднее изображениеView покинет экран, а затем закроется за backImageView (теперь это спереди), а затем изменит изображение внутри.

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

Мы сталкиваемся с одной ошибкой, которую мы не можем объяснить сами: , когда мы добавляем на наш счет прядильщик, наши анимационные сбои.

Проецированное изображение больше не выходит из экрана, а возвращается в исходное положение.

Мы крайне озадачены этим и подтвердили, что

    [self.view addSubview:spinner]; 

приведет к непредсказуемому поведению для нашей анимации.

Прилагает оштрафовать метод перемещения:

- (void)move:(UIPanGestureRecognizer *)sender { 
    CGPoint translatedPoint = [sender translationInView:self.frontView]; 

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 
     _firstX = self.frontView.center.x; 
     _firstY = self.frontView.center.y; 
    } 

    translatedPoint = CGPointMake(_firstX+translatedPoint.x, _firstY+translatedPoint.y); 
    [self.frontView setCenter:translatedPoint]; 

    if ([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 
     // Calculate the if the x-movement is greater than a threshold 
     float xTravelled = 0; 
     if (self.frontView.center.x > _firstX) 
      xTravelled = self.frontView.center.x - _firstX; 
     else 
      xTravelled = _firstX - self.frontView.center.x; 

     // Only move if xTravelled is greater than threshold 
     if (xTravelled > self.frontView.window.frame.size.width/3) { 
      NSLog(@"Swipe detected, currentIndex:%d", currentIndex); 

      // Lock view from panning until animation is finished. 
      self.view.userInteractionEnabled = NO; 

      float newXPosition; 
      if (self.frontView.center.x > _firstX) { 
       newXPosition = (float) self.view.frame.size.width * 2; 
      } else { 
       newXPosition = (float) -2 * self.view.frame.size.width; 
      } 

      // We should trigger a fetch as soon as the back image is empty. 
      if (![self getBackView].image) { 
       double delayInSeconds = 2.0; 
       dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
       dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
        //[self fetchComplete]; 
        [spinner stopAnimating]; 
        [spinner removeFromSuperview]; 
        self.view.userInteractionEnabled = YES; 
       }); 

       // Pop up spinner if necessary 
       if (![spinner isAnimating]) { 
        self.view.userInteractionEnabled = NO; 
        [spinner setCenter:CGPointMake(_firstX, _firstY)]; 
        [spinner startAnimating]; 
        /* THIS BREAKS OUR ANIMATION - Enable it to see 
        [self.view addSubview:spinner]; 
        */ 
       } 
      } 

      // Animate the rest of the swipe 
      [UIView \ 
      animateWithDuration:0.5f delay:0.0f options:UIViewAnimationOptionTransitionNone 
      animations:^{ 
       // Use smooth animation to move the top image out of the way 
       [self.frontView setCenter:CGPointMake(newXPosition, self.frontView.center.y)]; 
      } 
      completion:^(BOOL finished){ 
       // Set it to be physically behind the back image 
       [self.view sendSubviewToBack:self.frontView]; 
       //[self.frontView setCenter:CGPointMake(_firstX, _firstY)]; // why not necessary?? 

       // Now change the picture 
       UIImage *next = [self nextImage]; 
       self.frontView.image = next; 

       // update self.top to reference the new back image 
       self.frontView = [self getBackView]; 

       // Do not override spinner's block 
       if (![spinner isAnimating]) 
        self.view.userInteractionEnabled = YES; 
      }]; 
     } else { 
      NSLog(@"Swipe NOT detected"); 
      [UIView \ 
      animateWithDuration:0.5f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction 
      animations:^{ 
       [self.frontView setCenter:CGPointMake(_firstX, _firstY)]; 
      } completion:^(BOOL finished) { 
       self.view.userInteractionEnabled = YES; 
      }]; 
     } 
    } 

Я понимаю, что это довольно lenghty, но я изолировал эту ошибку в образце проект, который вы можете загрузить и запустить на своем компьютере. Этот пример проекта находится здесь: http://bit.ly/WO4cEI

Мы подозреваем, что добавление subview в self.view вызывает [self.view sendSubviewToBack: self.frontView] для отказа. Но мы не уверены, почему это приводит к тому, что наша анимация тоже терпит неудачу.

Спасибо за помощь!

EDIT

@ рекомендации user2113425 о неподвижной эту проблему !!

ответ

1

Прежде всего, вам не нужно добавлять счетчик в этот момент.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panRecognizer setMinimumNumberOfTouches:1]; 
    [panRecognizer setMaximumNumberOfTouches:1]; 

    [panRecognizer setDelegate:self]; 
    [self.view addGestureRecognizer:panRecognizer]; 
    self.view.userInteractionEnabled = YES; 

    // Index starts at zero so we pick even. 
    self.frontView = self.evenImage; 

    // Setting the images 
    images = [[NSArray alloc] initWithObjects:@"a.jpeg", @"b.jpeg", nil]; // @"c.jpeg", @"d.jpeg", @"e.jpeg", nil]; 

    currentIndex = 0; 
    self.evenImage.image = [self nextImage]; 
    self.oddImage.image = [self nextImage]; 

    // Spinner 
    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    **spinner.hidesWhenStopped = YES; 
    [self.view addSubview:spinner];** 
} 

вы можете добавить счетчик в viewDidLoad и набор hidesWhenStopped, чтобы скрыть его и в функции перемещения удалить [кок removeFromSuperview]; эта линия.

Проблема с addSubView является то, что она изменяет ZOrder из подвидов, это может быть связанно с этим, но не уверен ..

Есть много способов решить эту проблему ..

+0

Yup, что исправил его !!! но почему же ??? – disappearedng

0

Причины может быть анимация спиннера. Такое же явление появляется, когда viewController содержит таблицуView, которая освежает высокочастотные. Повторная нисходящая линия слоя разбивает анимацию. Причиной того, что прядильщик становится подчиненным представлением, вызывает подобное явление.

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