У меня есть два контроллера представления с перекрестным затуханием, оба из которых воспроизводят видео в своих подпредставлениях. Видео в представлении A начинает воспроизводиться, когда начинается постепенное нарастание изображения, и останавливается, когда оно заканчивается. Видео в представлении B начинается с постепенного появления и прекращается после постепенного исчезновения. Основные вещи. Я заставил его работать с MPMoviePlayerController, но я также хотел, чтобы звук постепенно появлялся / затухал, что вынудило меня использовать AVPlayer из AVFoundationFramework. В принципе, все, казалось, работало нормально, но я заметил, что переключатель вызывал нарушение плавного перехода. Альфа представления B просто перескакивает с 0 на 1, и блок завершения UIView animateWithDuration вызывается со значением false. Я заметил, что это происходит только тогда, когда я вызываю метод replaceCurrentItemWithPlayerItem: объекта AVPlayer во время метода loadView.
Код перекрестного затухания выглядит так:
- (void)pushViewController:(UIViewController *)viewController duration:(float)duration
{
float halfFadeInOutTime = duration/2.0;
viewController.view.alpha = 0.0;
UIView *tmpView = self.view;
[viewController viewWillAppear:YES];
//start fading out the first view
[UIView animateWithDuration:halfFadeInOutTime
delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
tmpView.alpha = 0.0;
}
completion:^(BOOL finished){
if( finished ){
if( [self respondsToSelector:@selector(fadeOutFinished:)] ){
[self fadeOutFinished:duration];
}
[self.navigationController pushViewController:viewController animated:NO];
//start fading in with the second view
[UIView animateWithDuration:halfFadeInOutTime
delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
viewController.view.alpha = 1.0;
}
completion:^(BOOL finished2){
if( finished2 ){
if( [((CrossfadeableViewController*)viewController) respondsToSelector:@selector(fadeInFinished:)] ){
[((CrossfadeableViewController*)viewController) fadeInFinished:duration];
}
}
}
];
if( [((CrossfadeableViewController*)viewController) respondsToSelector:@selector(fadeInStarted:)] ){
[((CrossfadeableViewController*)viewController) fadeInStarted:duration];
}
}
}
];
if( [self respondsToSelector:@selector(fadeOutStarted:)] ){
[self fadeOutStarted:duration];
}
}
Связанный с AVPlayer код в loadView выглядит так
- (void) loadView
{
[super loadView]
//...
/*
* Variables of type:
* UIView *videoPlaceholder;
* AVURLAsset *asset;
* AVPlayerItem *playerItem;
* AVPlayer *player;
* AVPlayerLayer *playerLayer;
*/
videoPlaceholder = [[UIView alloc] initWithFrame:_frame];
playerLayer = [[AVPlayerLayer alloc] init];
[playerLayer setFrame:videoPlaceholder.frame];
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
player = [[AVPlayer alloc] init];
NSString *_url = [[NSBundle mainBundle] pathForResource:[_videoFilename stringByDeletingPathExtension] ofType:[_videoFilename pathExtension]];
if( _url != nil ){
NSURL *url = [NSURL fileURLWithPath:_url];
asset = [AVURLAsset URLAssetWithURL:url options:nil];
playerItem = [AVPlayerItem playerItemWithAsset:asset];
[player replaceCurrentItemWithPlayerItem:playerItem];
[player seekToTime:kCMTimeZero];
[player setActionAtItemEnd:AVPlayerActionAtItemEndNone];
}
playerLayer.player = player;
[videoPlaceholder.layer addSublayer:playerLayer];
[self.view addSubview:videoPlaceholder];
//....
}
Кто-нибудь знает, что может вызвать ломку анимации? Я ничего не меняю в представлениях во время инициации, поскольку loadView вызывается до начала кроссфейда. А что может заставить один и тот же код работать с MPMoviePlayerController и ломаться с AVPlayer?
Ура, ПБ