2013-12-12 6 views
3

Я использую раскадровку. У меня есть 2 UIViewControler: view1 и view2. При нажатии любой из 6 кнопок на просмотр1 выполняется segue, и поэтому этот метод называется: prepareForSegue :. Теперь я хотел бы оживить представление1 до того, как он выполнит segue с 6 пользовательскими изображениями, называемыми navExitFrame1, navExitFrame2 ..., а затем покажет анимацию по умолчанию, установленную в раскадровке под Modal> flip horizontal.Выполнение пользовательской анимации с пользовательскими изображениями кадров

EDIT:

Я сейчас, используя этот код:

void (^animationBlock)() = ^{ 

     NSArray *images = @[[UIImage imageNamed:@"navExitFrame1.png"], 
          [UIImage imageNamed:@"navExitFrame2.png"], 
          [UIImage imageNamed:@"navExitFrame3.png"], 
          [UIImage imageNamed:@"navExitFrame4.png"], 
          [UIImage imageNamed:@"navExitFrame5.png"], 
          [UIImage imageNamed:@"navExitFrame6.png"]]; 

     UIImage *myimage = [UIImage imageNamed:@"profile.png"]; 

     [profileButton.imageView setImage:myimage]; 

     [self.view bringSubviewToFront:imageView]; 
     imageView.hidden = NO; 

     NSUInteger imagesCount = [images count]; 

     for(NSUInteger i=0; i<imagesCount; i++) { 

      [UIView addKeyframeWithRelativeStartTime:i/(CGFloat)imagesCount 
            relativeDuration:1/(CGFloat)imagesCount 
              animations:^{ 

               imageView.image = images[i]; 

              }]; 
     } 
    }; 

    [UIView animateKeyframesWithDuration:1 delay:0 options:UIViewKeyframeAnimationOptionCalculationModeDiscrete animations:animationBlock completion:^(BOOL finished) { 

     if (sender == feelingsButton) { 

      NSString *save = @"feelings"; 
      [[NSUserDefaults standardUserDefaults] setObject:save forKey:@"segueID"]; 

     } else if (sender == placesButton) { 

      NSString *save = @"places"; 
      [[NSUserDefaults standardUserDefaults] setObject:save forKey:@"segueID"]; 

     }else if (sender == peopleButton) { 

      NSString *save = @"people"; 
      [[NSUserDefaults standardUserDefaults] setObject:save forKey:@"segueID"]; 

     }else if (sender == settingsButton) { 

      NSString *save = @"settings"; 
      [[NSUserDefaults standardUserDefaults] setObject:save forKey:@"segueID"]; 

     }else if (sender == profileButton) { 

      NSString *save = @"profile"; 
      [[NSUserDefaults standardUserDefaults] setObject:save forKey:@"segueID"]; 

     }else if (sender == mainWebView || sender == mainWebView.gestureRecognizers) { 

      NSString *save = @"newsfeed"; 
      [[NSUserDefaults standardUserDefaults] setObject:save forKey:@"segueID"]; 
     } 

     [self performSegueWithIdentifier:@"ContentVWS" sender:nil]; 

    }]; 
} 

Что происходит здесь является то, что анимация происходит, но в пространстве микросекунды, я попытался изменение значения о продолжительности в

animateKeyframesWithDuration: 1

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

UIView animateKeyframesWithDuration:1 delay:0 options:UIViewKeyframeAnimationOptionCalculationModeDiscrete animations:animationBlock completion:^(BOOL finished) { 

неверны, я NSloged их завершения, но только переменный я правильно и imagesCount правильно тоже, но когда я делаю я/(CGFloat) imagesCount это, кажется, всегда возвращаюсь 0 по какой-то причине. Это связано с этим?

ответ

3

ОК, похоже, новый способ анимации ключевого кадра в iOS7 не хочет хорошо играть с изменениями в uiimage на изображении, поэтому вместо этого нам придется использовать анимацию CAKeyframe: Этот ответ частично связан с здесь: http://stackoverflow.com/questions/16025769/how-do-i-simultaneously-animate-a-uiimageviews-image-and-the-uiimageview-itself

-(IBAction)animateImagesThenPushView:(id)sender{ 

    NSArray *images = @[[UIImage imageNamed:@"navExitFrame1.png"], 
         [UIImage imageNamed:@"navExitFrame2.png"], 
         [UIImage imageNamed:@"navExitFrame3.png"], 
         [UIImage imageNamed:@"navExitFrame4.png"], 
         [UIImage imageNamed:@"navExitFrame5.png"], 
         [UIImage imageNamed:@"navExitFrame6.png"]]; 

    NSMutableArray *keyTimes = [NSMutableArray arrayWithCapacity:images.count]; 
    for (int i = 0; i<images.count; i++) { 
     keyTimes[i] = @(0.0 + (i+1)*(1.0/images.count)); 
    } 

    CAKeyframeAnimation *imageAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
    imageAnimation.calculationMode = kCAAnimationDiscrete; // or maybe kCAAnimationPaced 
    imageAnimation.duration = .5; 
    imageAnimation.keyTimes = keyTimes; 
    imageAnimation.repeatCount = 0; 
    // the following method will need to be implemented to cast your UIImage array to CGImages 
    imageAnimation.values = [self animationCGImagesArrayFromImageArray:images]; 
    imageAnimation.delegate = self; 
    [self.imageView.layer addAnimation:imageAnimation forKey:@"content"]; 

} 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 
    self.imageView.image = [UIImage imageNamed:@"navExitFrame6.png"]; 
    // put your segue logic here to push the next view 
} 

-(NSArray*)animationCGImagesArrayFromImageArray:(NSArray*)imageArray { 
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:imageArray.count]; 
    for (UIImage *image in imageArray) { 
     [array addObject:(id)[image CGImage]]; 
    } 
    return [NSArray arrayWithArray:array]; 
} 
+0

Как настроить анимацию для использования фреймов. – ge0rges

+0

Я вижу, что вы имеете в виду с анимацией. Использование анимированного изображения не будет работать для вас в этой настройке. Вам нужна анимация ключевого кадра. если вы ориентируетесь только на iOS7, вы можете использовать метод анимации UIView: 'animateKeyframesWithDuration: delay: options: animation: completion:' См. здесь: https://github.com/ShinobiControls/iOS7-day-by- day/blob/master/11-uiview-keyframe-animation/11-uiview-keyframe-animation.md для хорошего учебника – tjboneman

+0

Я использовал этот метод, и я могу видеть изображения, но для одной микросекунды, но я установил продолжительность 1.0 ... – ge0rges

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