2つのUIImageViews
を作成するのではなく、1つのビューのimage
を単に変更することは論理的に思えます。私がそれを行うと、インスタントスイッチではなく、2つの画像間でフェード/クロスディゾルブが発生しますか?
編集: @ algal below 。からより良い解決策があります
これを行う別の方法は、事前定義された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のView Transitionsサンプルプロジェクトを参照してください。 https://developer.Apple.com/library/content/samplecode/ViewTransitions/Introduction/Intro.html#//Apple_ref/doc/uid/DTS40007411
新しいブロックベースのUIKitアニメーションメソッドを使用すると、より簡単になります。
次のコードがView Controllerにあり、クロスディゾルブしたいUIImageViewがself.imageViewプロパティを介してアドレス指定可能なself.viewのサブビューであるとします。それからあなたが必要とするすべては次のとおりです:
UIImage * toImage = [UIImage imageNamed:@"myname.png"];
[UIView transitionWithView:self.imageView
duration:5.0f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.imageView.image = toImage;
} completion:nil];
できた.
Swiftでそれを行うには、次のようになります。
let toImage = UIImage(named:"myname.png")
UIView.transitionWithView(self.imageView,
duration:5,
options: UIViewAnimationOptions.TransitionCrossDissolve,
animations: { self.imageView.image = toImage },
completion: nil)
Swift 3.
let toImage = UIImage(named:"myname.png")
UIView.transition(with: self.imageView,
duration: 0.3,
options: .transitionCrossDissolve,
animations: {
self.imageView.image = toImage
},
completion: nil)
はい、あなたの言うことは絶対に正しいです、そしてそれはそれをする方法です。私はこのメソッドを書き、常にこれを使用して自分のイメージをフェードします。このために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;
}
画像をフェードアウトするには、反対のことを行うことができます。フェードアウトした後。スーパービューから削除するだけです(UIImageView
)。 [imageView removeFromSuperview]
。
Swift 3.0.1の場合:
UIView.transition(with: self.imageView,
duration:0.5,
options: .transitionCrossDissolve,
animations: { self.imageView.image = newImage },
completion: nil)
次の例のように、フェードイン機能をサブクラスにパッケージ化して、共通の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:
関数で実際にフェードインを実装する方法は変更でき、この質問に対する他の回答で説明されている他の優れた例の1つになる可能性があります。ここで行っている追加のオンザフライ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];
}];
}
}
上記のコードはいくつかの仮定に基づいており(XCodeプロジェクトで有効化されているARCを含む)、概念の証明としてのみ意図されており、明確さと焦点のために、関連するままです重要な無関係なコードを省略します。盲目的にコピーアンドペーストしないでください。
移行を無期限に繰り返す必要がありました。これには多くの試行錯誤が必要でしたが、最終的には探していた最終結果が得られました。これらは、UITableViewCellのUIImageViewに画像アニメーションを追加するためのコードスニペットです。
関連するコードは次のとおりです。
@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;
}
UIView.transition()
で遊んで.transitionCrossDissolve
オプションで問題が発生した後(1つのUIImageView内で画像の変化をアニメーション化しようとして、アニメーションなしで即座に遷移が発生しました)ビュー内で変化するプロパティをアニメーション化できます(Swift 4.2):
UIView.transition(with: self.imageView,
duration: 1,
options: [.allowAnimatedContent, .transitionCrossDissolve],
animations: { self.imageView.image = newImage },
completion: nil)
さらに、imageViewにサブビューがある場合、同様に再描画され、アニメーションが妨げられる可能性があります。たとえば、imageViewにぼかしのあるサブビューがあり、その場合はアニメーションが機能しません。そこで、ビュー階層を変更し、ぼかしを独自のビューに移動して、imageViewの上に配置しました。
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)
これが最短の方法だと思います。 UIViewアニメーションを作成し、imageViewでコミットします。
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[myImageView setAlpha:0.0];
[UIView commitAnimations];