Затухание / растворение при изменении изображения UIImageView

Вместо создания двух UIImageViews , кажется логичным просто изменить image одного вида. Если я это сделаю, есть ли когда-либо из-за того, что размытие / перекрестье растворяется между двумя изображениями, а не мгновенным переключателем?

Изменить: есть лучшее решение от @algal ниже .

Другой способ сделать это – использовать предопределенные переходы CAAnimation:

 CATransition *transition = [CATransition animation]; transition.duration = 0.25; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionFade; transition.delegate = self; [self.view.layer addAnimation:transition forKey:nil]; view1.hidden = YES; view2.hidden = NO; 

См. Проект примера «Просмотр переходов» от Apple: https://developer.apple.com/library/content/samplecode/ViewTransitions/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007411

Это может быть намного проще с использованием новых методов анимации UIKit на основе блоков.

Предположим, что следующий код находится в контроллере представления, а UIImageView, который вы хотите перекрестно растворить, является подпунктом self.view, адресуемым через свойство self.imageView. Тогда вам нужно только:

 UIImage * toImage = [UIImage imageNamed:@"myname.png"]; [UIView transitionWithView:self.imageView duration:5.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ self.imageView.image = toImage; } completion:nil]; 

Готово.

И сделать это в Свифт, это так:

 let toImage = UIImage(named:"myname.png") UIView.transitionWithView(self.imageView, duration:5, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: { self.imageView.image = toImage }, completion: nil) 

Swift 3.0

  let toImage = UIImage(named:"myname.png") UIView.transition(with: self.imageView, duration: 0.3, options: .transitionCrossDissolve, animations: { self.imageView.image = toImage }, completion: nil) 

Да, что вы говорите, абсолютно правильно, и это способ сделать это. Я написал этот метод и всегда использую это для Fade на моем изображении. Для этого я имею дело с CALayer . Для этого вам нужно импортировать Core Animation.

 + (void)fadeInLayer:(CALayer *)l { CABasicAnimation *fadeInAnimate = [CABasicAnimation animationWithKeyPath:@"opacity"]; fadeInAnimate.duration = 0.5; fadeInAnimate.repeatCount = 1; fadeInAnimate.autoreverses = NO; fadeInAnimate.fromValue = [NSNumber numberWithFloat:0.0]; fadeInAnimate.toValue = [NSNumber numberWithFloat:1.0]; fadeInAnimate.removedOnCompletion = YES; [l addAnimation:fadeInAnimate forKey:@"animateOpacity"]; return; } 

Вы можете сделать противоположное для Fade изображение. После этого он исчезает. Вы просто удаляете его из супервизора (это UIImageView ). [imageView removeFromSuperview] .

Вы также можете упаковать функцию fade-in в подкласс, чтобы затем использовать ее как обычный UIImageView, как в следующем примере:

 IMMFadeImageView *fiv=[[IMMFadeImageView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)]; [self.view addSubview:fiv]; fiv.image=[UIImage imageNamed:@"initialImage.png"]; fiv.image=[UIImage imageNamed:@"fadeinImage.png"]; // fades in 

Далее следует возможная реализация.

Примечание: способ, которым вы фактически реализуете постепенное изменение в функции setImage: может измениться и может быть одним из других превосходных примеров, описанных в других ответах на этот вопрос, – создание дополнительного на лету UIImageView поскольку я здесь может быть неприемлемым накладные расходы в вашей конкретной ситуации .

IMMFadeImageView.h :

 #import <UIKit/UIKit.h> @interface IMMFadeImageView : UIImageView @property (nonatomic,assign) float fadeDuration; @end 

IMMFadeImageView.m :

 #import "IMMFadeImageView.h" @implementation IMMFadeImageView @synthesize fadeDuration; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.fadeDuration=1; } return self; } -(void)setImage:(UIImage *)newImage{ if(!self.image||self.fadeDuration<=0){ super.image=newImage; } else { UIImageView *iv=[[UIImageView alloc] initWithFrame:self.bounds]; iv.contentMode=self.contentMode; iv.image=super.image; iv.alpha=1; [self addSubview:iv]; super.image=newImage; [UIView animateWithDuration:self.fadeDuration delay:0 options:UIViewAnimationCurveEaseInOut animations:^{ iv.alpha=0; } completion:^(BOOL finished) { [iv removeFromSuperview]; }]; } } 

Вышеприведенный код основывается на нескольких предположениях (включая ARC, которые включены в вашем проекте XCode), предназначен только для доказательства концепции, и в интересах ясности и фокусировки он остается актуальным, опуская важный несвязанный код. Пожалуйста, не просто скопируйте его вслепую.

Мне нужен переход, чтобы повторять бесконечно. Для этого потребовалось много проб и ошибок, но я, наконец, получил конечный результат, который я искал. Это фрагменты кода для добавления анимации изображений в UIImageView в UITableViewCell.

Вот соответствующий код:

 @interface SomeViewController () @property(nonatomic, strong) NSMutableArray *imagesArray; @property(nonatomic, assign) NSInteger varietyImageAnimationIndex; @property(nonatomic, assign) BOOL varietyImagesAnimated; @end @implementation SomeViewController @synthesize imagesArray; @synthesize varietyImageAnimationIndex; @synthesize varietyImagesAnimated; ... // NOTE: Initialize the array of images in perhaps viewDidLoad method. -(void)animateImages { varietyImageAnimationIndex++; [UIView transitionWithView:varietyImageView duration:2.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ varietyImageView.image = [imagesArray objectAtIndex:varietyImageAnimationIndex % [imagesArray count]]; } completion:^(BOOL finished) { [self animateImages]; }]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... [cell.imageView setImage:[imagesArray objectAtIndex:0]]; [self setVarietyImageView:cell.imageView]; if (! varietyImagesAnimated) { varietyImagesAnimated = YES; [self animateImages]; } ... return cell; } 

Для Swift 3.0.1:

 UIView.transition(with: self.imageView, duration:0.5, options: .transitionCrossDissolve, animations: { self.imageView.image = newImage }, completion: nil) 

Ссылка: https://gist.github.com/licvido/bc22343cacfa3a8ccf88

Это, я думаю, самый короткий способ сделать это. Создайте анимацию UIView и зафиксируйте ее на вашем изображении.

 [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; [myImageView setAlpha:0.0]; [UIView commitAnimations]; 

Используя свойство highlightedImage это можно сделать немного проще. Вот пример в Swift 3. Сначала установите как нормальное, так и выделенное изображение:

 let imageView = UIImageView(image: UIImage(named: "image"), highlightedImage: UIImage(named: "highlightedImage")) 

И когда вы хотите изменить между этими анимированными:

 UIView.transition(with: imageView, duration: 0.3, options: .transitionCrossDissolve, animations: { self.imageView.isHighlighted = !self.imageView.isHighlighted}, completion: .none) 
  • Как правильно реализовать ленивый экземпляр с использованием свойства @IBOutlet в Swift
  • Доступ к календарю UIDocumentInteractionController
  • Как поместить зеленую иконку Добавить в строке Вставить
  • Подождите, пока popToRootViewControllerAnimated: ДА анимация выполнена
  • UITableViewCell Удалить анимацию кнопки
  • Ошибка приложения ... objc_exception_throw
  • Как разместить текст-заполнитель в UISearchBar iOS 11
  • Пропустить UIView через события касания?
  • Действительно застрял на экране вращения iOS 6, мне нужен xib, заблокированный для портрета
  • разница между presentViewController и UINavigationController?
  • XCode: где разместить ресурсы изображения
  • Давайте будем гением компьютера.