Bir UIImageView görüntü değişikliği nasıl canlandırılır?


200

UIImageViewBir resim ile bir var . Şimdi tamamen yeni bir görüntüm var (grafik dosyası) ve bunu burada göstermek istiyorum UIImageView. Eğer yeni koyarsam

myImageView.image = newImage;

yeni görüntü hemen görünür. Animasyonlu değil.

Yeni görüntüye hoş bir şekilde solmasını istiyorum. Bunun UIImageViewüzerine yeni bir tane yaratmak ve animasyonla harmanlamaktan daha iyi bir çözüm olduğunu düşündüm.


Yanıtlar:


260

Desteklenen tüm görünüm geçişleri UIViewAnimationTransitionnumaralandırmada tanımlanmış gibi göründüğü için solmaya etkisi ile UIViews canlandırabileceğinizden emin değilim . Solma efekti CoreAnimation kullanılarak elde edilebilir. Bu yaklaşım için örnek örnek:

#import <QuartzCore/QuartzCore.h>
...
imageView.image = [UIImage imageNamed:(i % 2) ? @"3.jpg" : @"4.jpg"];

CATransition *transition = [CATransition animation];
transition.duration = 1.0f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;

[imageView.layer addAnimation:transition forKey:nil];

2
Bir resimden diğerine geçerken kodunuz mükemmel bir şekilde çalıştı. Bir UIImageView (animationImages özelliği) içindeki görüntülerin otomatik animasyonuyla nasıl çalışacağını biliyor musunuz?
CedricSoubrie

Efektin aynı olup olmayacağından emin değilim, katmanın content özelliği için CAKeyFrameAnimation'ı kullanmayı deneyebilirsiniz. Veya animasyon temsilcisini ayarlayın ve temsilci geri arama işlevinde, önceki animasyon bittiğinde bir sonraki resme animasyon eklemeye başlayın.
Vladimir

2
Bu, ayrı bir görüntü görünümünü manuel olarak çapraz geçişten kesinlikle daha basittir. Teşekkürler!
Kevlar

Şey .. Eğer hayaller çerçeve değişirse o zaman aynı pozisyonda kalır .. bu bir anlaşma kırıcı!
hfossli

@Fossli, animasyon sırasında kare değiştiğinde mi demek istiyorsun? O zaman bu farklı bir soru
Vladimir

368
[UIView transitionWithView:textFieldimageView
                  duration:0.2f
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    imageView.image = newImage;
                } completion:nil];

başka bir olasılık


1
basit ve görüntüler arasında diğer animasyon efektleri bir dizi açar.
So Over It

1
@Hfossli'nin çerçeve değişiklikleriyle ilgili olarak bahsettiği sorunla aynı. Bu sırada mizanpajlar değiştirilirse animasyon durgun olur.
Geva

1
Bu en iyi çözümdür, çünkü diğer animasyonlarla birleştirilebilir.
kelin

162

Michael Scott'un sözleriyle, basit salak tutun. Swift 3 ve Swift 4'te bunu yapmanın basit bir yolu :

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

3
Tıkır tıkır çalışıyor. Teşekkürler!
RobertoAllende

1
Uau harika! Bu kadar uzun bir süre için bu lanet olsun bilmiyordum :)
sabiland

1
Bu 1 resme dönüşecektir. bir dizi resmim varsa ve geçiş animasyonu ile tek tek göstermek istersem ne olur?
Ammar Mujeeb

1
Bir sonrakine geçmek için tamamlama bloğunu kullanabilirsiniz.
Zia

41

Burada bir örnektir Swift ilk çapraz yeni bir resim erimesi ve daha sonra bir yaşam dolu animasyon katacak:

var selected: Bool {
  willSet(selected) {
    let expandTransform:CGAffineTransform = CGAffineTransformMakeScale(1.15, 1.15);
    if (!self.selected && selected) {
      UIView.transitionWithView(self.imageView,
        duration:0.1,
        options: UIViewAnimationOptions.TransitionCrossDissolve,
        animations: {
          self.imageView.image = SNStockCellSelectionAccessoryViewImage(selected)
          self.imageView.transform = expandTransform
        },
        completion: {(finished: Bool) in
          UIView.animateWithDuration(0.4,
            delay:0.0,
            usingSpringWithDamping:0.40,
            initialSpringVelocity:0.2,
            options:UIViewAnimationOptions.CurveEaseOut,
            animations: {
              self.imageView.transform = CGAffineTransformInvert(expandTransform)
            }, completion:nil)
      })
    }
  }
}

var imageView:UIImageView

Eğer imageViewdoğru arasındaki geçiş, bir subview görünümüne eklenir selected = falseiçin selected = truebir balondan animasyon görüntüsünü takas gerekir. SNStockCellSelectionAccessoryViewImagegeçerli seçim durumuna göre farklı bir görüntü döndürür, aşağıya bakın:

private let SNStockCellSelectionAccessoryViewPlusIconSelected:UIImage = UIImage(named:"PlusIconSelected")!
private let SNStockCellSelectionAccessoryViewPlusIcon:UIImage = UIImage(named:"PlusIcon")!

private func SNStockCellSelectionAccessoryViewImage(selected:Bool) -> UIImage {
  return selected ? SNStockCellSelectionAccessoryViewPlusIconSelected : SNStockCellSelectionAccessoryViewPlusIcon
}

Aşağıdaki GIF örneği biraz yavaşladı, gerçek animasyon daha hızlı gerçekleşiyor:

                                       UIImageView sıçrama animasyon Gif


16

Kod:

var fadeAnim:CABasicAnimation = CABasicAnimation(keyPath: "contents");

fadeAnim.fromValue = firstImage;
fadeAnim.toValue   = secondImage;
fadeAnim.duration  = 0.8;         //smoothest value

imageView.layer.addAnimation(fadeAnim, forKey: "contents");

imageView.image = secondImage;

Misal:

Koddan UIImageView örneği

Eğlenceli, Daha Ayrıntılı Çözüm : ( Bir dokunuşla geçiş yapma )

    let fadeAnim:CABasicAnimation = CABasicAnimation(keyPath: "contents");

    switch imageView.image {
        case firstImage?:
            fadeAnim.fromValue = firstImage;
            fadeAnim.toValue   = secondImage;
            imageView.image    = secondImage;
        default:
            fadeAnim.fromValue = secondImage;
            fadeAnim.toValue   = firstImage;
            imageView.image    = firstImage;
    }

    fadeAnim.duration = 0.8;

    imageView.layer.addAnimation(fadeAnim, forKey: "contents");

10

Bunu dene:

_imageView.image = image;
[_imageView.layer addAnimation:[CATransition animation] forKey:kCATransition];

swift: _imageView.layer.addAnimasyon (CATransition (), forKey: kCATransition)
Eugene Braginets

8

Swift 3 ile

extension UIImageView{   
 var imageWithFade:UIImage?{
        get{
            return self.image
        }
        set{
            UIView.transition(with: self,
                              duration: 0.5, options: .transitionCrossDissolve, animations: {
                                self.image = newValue
            }, completion: nil)
        }
    }
}

Kullanımı:

myImageView.imageWithFade = myImage

6

Neden denemiyorsun.

NSArray *animationFrames = [NSArray arrayWithObjects:
  [UIImage imageWithName:@"image1.png"],
  [UIImage imageWithName:@"image2.png"], 
  nil];

UIImageView *animatedImageView = [[UIImageView alloc] init];
animatedImageView.animationImages = animationsFrame;
[animatedImageView setAnimationRepeatCount:1];
[animatedImageView startAnimating];

Hızlı bir versiyon:

let animationsFrames = [UIImage(named: "image1.png"), UIImage(named: "image2.png")]
let animatedImageView = UIImageView()
animatedImageView.animationImages = animationsFrames
animatedImageView.animationRepeatCount = 1
animatedImageView.startAnimating()

Bu, UIImageView'i sonsuza kadar geçiş yapmayı tekrarlayacak şekilde ayarlar ... yazar sadece bir değişiklik
istiyordu

setAnimationRepeatCount
William Hu

SetAnimationRepeatCount hiçbir şeyi değiştirmez. Asla durmaz
Yücel Bayram

5
CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"contents"];
fadeAnim.fromValue = (__bridge id)imageView.image.CGImage;
fadeAnim.toValue = (__bridge id)[UIImage imageNamed:@"newImage.png"].CGImage;
fadeAnim.duration = 2.0;
[imageView.layer addAnimation:fadeAnim forKey:@"contents"];
imageView.layer.contents = (__bridge id)[UIImage imageNamed:@"newImage.png"].CGImage;

3

Burada birkaç farklı yaklaşım var: UIA benim hatırlamam için meydan okuma gibi görünüyor.

Düzenleme: benim çok tembel :)

Mesajda, bu yönteme atıfta bulunuyordum:

[newView setFrame:CGRectMake( 0.0f, 480.0f, 320.0f, 480.0f)]; //notice this is OFF screen!
[UIView beginAnimations:@"animateTableView" context:nil];
[UIView setAnimationDuration:0.4];
[newView setFrame:CGRectMake( 0.0f, 0.0f, 320.0f, 480.0f)]; //notice this is ON screen!
[UIView commitAnimations];

Ancak kareyi animasyon yerine alfaya animasyon uygularsınız:

[newView setAlpha:0.0]; // set it to zero so it is all gone.
[UIView beginAnimations:@"animateTableView" context:nil];
[UIView setAnimationDuration:0.4];
[newView setAlpha:0.5]; //this will change the newView alpha from its previous zero value to 0.5f
[UIView commitAnimations];

2

İOS 5'ten itibaren bu çok daha kolay:

[newView setAlpha:0.0];
[UIView animateWithDuration:0.4 animations:^{
    [newView setAlpha:0.5];
}];

4
Bu, orijinal soruna yardımcı olmaz, bu da zaten görüntülenen bir görüntünüz olması ve yeni bir görüntüye çapraz
solmak istemeniz

4
doğru .. bu cevap soruyu çözmez. Soru, görüntüde solma değil, eski bir görüntüden yeni bir görüntüye solma idi. Animasyon blokları iOS 4'te tanıtıldı.
Bastian

2

Swift 4 Bu harika

  self.imgViewPreview.transform = CGAffineTransform(scaleX: 0, y: 0)
          UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0, options: .curveEaseOut, animations: {
              self.imgViewPreview.image = newImage
              self.imgViewPreview.transform = .identity
          }, completion: nil)

1

Vladimir'in cevabı mükemmel, ama benim gibi hızlı bir çözüm arayan herkes

Bu Çözüm Hızlı Sürüm 4.2 için Çalışır

var i = 0
    func animation(){
        let name = (i % 2 == 0) ? "1.png" : "2.png"
        myImageView.image = UIImage.init(named: name)
        let transition: CATransition = CATransition.init()
        transition.duration = 1.0
        transition.timingFunction = CAMediaTimingFunction.init(name: .easeInEaseOut)
        transition.type = .fade
        myImageView.layer.add(transition, forKey: nil)
        i += 1
    }

Bu yöntemi her yerden çağırabilirsiniz. Görüntüyü animasyonla bir sonrakine (görüntü) değiştirir.

İçin Swift Sürüm 4.0 Kullan feryat çözümü

var i = 0
    func animationVersion4(){
        let name = (i % 2 == 0) ? "1.png" : "2.png"
        uiImage.image = UIImage.init(named: name)
        let transition: CATransition = CATransition.init()
        transition.duration = 1.0
        transition.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionFade
        uiImage.layer.add(transition, forKey: nil)
        i += 1
    }

0

Swift 5 uzantısı:

extension UIImageView{
    func setImage(_ image: UIImage?, animated: Bool = true) {
        let duration = animated ? 0.3 : 0.0
        UIView.transition(with: self, duration: duration, options: .transitionCrossDissolve, animations: {
            self.image = image
        }, completion: nil)
    }
}
 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.