İki görünüm oluşturmak yerine , tek bir görünümün UIImageViews
değiştirilmesi mantıklı görünmektedir image
. Bunu yaparsam, bir anlık anahtar yerine iki görüntü arasında solma / çapraz çözünme var mı?
İki görünüm oluşturmak yerine , tek bir görünümün UIImageViews
değiştirilmesi mantıklı görünmektedir image
. Bunu yaparsam, bir anlık anahtar yerine iki görüntü arasında solma / çapraz çözünme var mı?
Yanıtlar:
Düzenleme: @ @galgal'den daha iyi bir çözüm var .
Bunu yapmanın başka bir yolu, önceden tanımlanmış CAAnimation geçişlerini kullanmaktır:
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'dan Geçişleri Görüntüle örnek projesine bakın: https://developer.apple.com/library/content/samplecode/ViewTransitions/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007411
Yeni blok tabanlı UIKit animation
yöntemleri kullanmak çok daha basit olabilir .
Aşağıdaki kod görünümü denetleyicisi olduğunu, ve çapraz erimesi istediğiniz UIImageView özelliği aracılığıyla self.view adreslenebilir bir Subview olduğunu varsayalım self.imageView
olan tüm gerekmez Ardından:
UIImage * toImage = [UIImage imageNamed:@"myname.png"];
[UIView transitionWithView:self.imageView
duration:5.0f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.imageView.image = toImage;
} completion:nil]
Bitti.
Ve Swift'te yapmak için, şöyle:
let toImage = UIImage(named:"myname.png")
UIView.transitionWithView(self.imageView,
duration:5,
options: UIViewAnimationOptions.TransitionCrossDissolve,
animations: { self.imageView.image = toImage },
completion: nil)
Hızlı 3, 4 ve 5
let toImage = UIImage(named:"myname.png")
UIView.transition(with: self.imageView,
duration: 0.3,
options: .transitionCrossDissolve,
animations: {
self.imageView.image = toImage
},
completion: nil)
Swift 3.0.1 için:
UIView.transition(with: self.imageView,
duration:0.5,
options: .transitionCrossDissolve,
animations: { self.imageView.image = newImage },
completion: nil)
Referans: https://gist.github.com/licvido/bc22343cacfa3a8ccf88
Evet söyledikleriniz kesinlikle doğrudur ve bunu yapmanın yolu budur. Bu yöntemi yazdım ve her zaman görüntümde solmaya kullanın. Bununla ilgileniyorum CALayer
. Bunun için Temel Animasyonu içe aktarmanız gerekir.
+ (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;
}
Bir görüntüyü yavaşlatmak için tam tersini yapabilirsiniz. Sönükleştikten sonra. Sadece denetimden kaldırın (ki UIImageView
). [imageView removeFromSuperview]
.
Ayrıca, soluklaştırma özelliğini bir alt sınıfta paketleyebilir, böylece aşağıdaki örnekte olduğu gibi ortak bir UIImageView olarak kullanabilirsiniz:
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
Bunu olası bir uygulama izler.
Not: setImage:
işlevde solmaya karşı uygulama şekliniz değişebilir ve bu sorunun diğer yanıtlarında açıklanan diğer mükemmel örneklerden biri olabilir - UIImageView
burada yaptığım gibi anında bir ek oluşturma özel durumunuzda kabul edilemez bir ek yük olmak .
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];
}];
}
}
Yukarıdaki kod (XCode projenizde ARC'nin etkinleştirilmesi de dahil olmak üzere) birkaç varsayımlara dayanır, sadece kavramın bir kanıtı olarak tasarlanmıştır ve netlik ve odaklanma açısından, önemli ilişkisiz kodu atlayarak ilgili kalır. Lütfen sadece körü körüne kopyalayıp yapıştırmayın.
Süresiz olarak tekrarlamak için geçişe ihtiyacım vardı. Bu bir sürü deneme yanılma aldı ama sonunda aradığım sonucu aldım. Bunlar, bir UITableViewCell'de bir UIImageView'e görüntü animasyonu eklemek için kod parçacıklarıdır.
İlgili kod:
@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;
}
Etrafta oynadıktan UIView.transition()
ve .transitionCrossDissolve
seçeneklerle ilgili sorunlar aldıktan sonra (bir UIImageView içinde değişen görüntüleri canlandırmaya çalışıyordum ve animasyon olmadan anında gerçekleşti) Sadece görünümün içinde değişen özellikleri canlandırmanıza izin veren bir seçenek daha eklemeniz gerektiğini öğrendim ( Swift 4.2 ) ile ilişkili olan kısmını dışarı aktarmak suretiyle yedek oluşturmanız gerekir :
UIView.transition(with: self.imageView,
duration: 1,
options: [.allowAnimatedContent, .transitionCrossDissolve],
animations: { self.imageView.image = newImage },
completion: nil)
Buna ek olarak: imageView üzerinde alt görünümleriniz varsa, yeniden çizilecek ve animasyonu engelleyebilir. Örneğin, benim imageView üzerinde bulanıklık ile alt görünüm vardı ve bu durumda animasyon çalışmıyor. Bu yüzden görünüm hiyerarşimi değiştirdim ve bulanıklığı kendi görünümüne taşıdım ve imageView üzerine koydum.
highlightedImage
Özelliği kullanarak bu biraz daha basit hale getirilebilir. Swift 3'te bir örnek: Önce hem normal hem de vurgulanan görüntüyü ayarlayın:
let imageView = UIImageView(image: UIImage(named: "image"), highlightedImage: UIImage(named: "highlightedImage"))
Animasyonlu olanlar arasında geçiş yapmak istediğinizde:
UIView.transition(with: imageView, duration: 0.3, options: .transitionCrossDissolve, animations: { self.imageView.isHighlighted = !self.imageView.isHighlighted}, completion: .none)