UIImageView에서 이미지 변경을 애니메이션으로 만드는 방법은 무엇입니까?


199

나는이 UIImageView이미지와 함께. 이제 완전히 새로운 이미지 (그래픽 파일)가 있으며이 이미지를 표시하고 싶습니다 UIImageView. 방금 설정하면

myImageView.image = newImage;

새로운 이미지가 즉시 보입니다. 애니메이션 할 수 없습니다.

나는 새로운 이미지로 멋지게 사라지기를 원합니다. 나는 UIImageView그 위에 새로운 것을 만들고 애니메이션과 혼합 하는 것보다 더 나은 해결책이 있다고 생각 했습니까?


답변:


260

지원되는 모든 뷰 전환이 UIViewAnimationTransition열거에 정의 된 것처럼 페이드 효과로 UIView에 애니메이션을 적용 할 수 있는지 확실하지 않습니다 . 페이딩 효과는 CoreAnimation을 사용하여 얻을 수 있습니다. 이 방법의 샘플 예 :

#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
한 이미지에서 다른 이미지로 갈 때 코드가 완벽하게 작동했습니다. UIImageView (animationImages 속성)에서 이미지의 자동 애니메이션으로 작동시키는 방법을 알고 있습니까?
CedricSoubrie

레이어의 content 속성에 CAKeyFrameAnimation을 사용하려고해도 효과가 같은지 확실하지 않습니다. 또는 애니메이션 델리게이트를 설정하고 델리게이트 콜백 함수에서 이전 애니메이션이 완료되면 다음 이미지에 애니메이션이 시작됩니다.
블라디미르

2
이것은 별도의 이미지 뷰를 수동으로 크로스 페이딩하는 것보다 훨씬 간단합니다. 감사!
Kevlar

이미지 뷰 프레임이 바뀌면 같은 위치에 유지됩니다.
hfossli

@ Fossli, 애니메이션 중 프레임이 변경되는 것을 의미합니까? 그것은 다른 질문입니다
Vladimir

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

또 다른 가능성이다


1
간단하고 이미지 사이의 다른 모든 애니메이션 효과를 엽니 다.
So Over It

1
@hfossli가 프레임 변경과 관련하여 언급 한 것과 동일한 문제가 있습니다. 그 동안 레이아웃이 변경되면 애니메이션이 느려집니다.
Geva

1
다른 애니메이션과 결합 할 수 있기 때문에 이것이 가장 좋은 솔루션입니다.
kelin

161

Michael Scott의 말에 따르면, 간단하게 바보로 유지하십시오. Swift 3Swift 4 에서이를 수행하는 간단한 방법은 다음과 같습니다 .

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

3
매력처럼 작동합니다. 감사!
RobertoAllende

1
대단해! 이 빌어 먹을 그것에 대해 너무 오랫동안
몰랐어요

1
이미지 1 개로 변경됩니다. 이미지 배열이 있고 전환 애니메이션으로 하나씩 표시하려면 어떻게해야합니까?
Ammar Mujeeb

1
완료 블록을 사용하여 다음 블록으로 전환 할 수 있습니다.
Zia

41

다음은 Swift 에서 새 이미지를 먼저 교차 용해하고 탄력성 애니메이션을 추가하는 예입니다.

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

imageView뷰에 하위 뷰로 올바르게 추가 된 경우 이미지 사이 selected = false를 전환 selected = true하여 탄력 애니메이션으로 전환 해야합니다. SNStockCellSelectionAccessoryViewImage현재 선택 상태에 따라 다른 이미지 만 반환합니다 (아래 참조).

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

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

아래의 GIF 예제는 약간 느려졌으며 실제 애니메이션은 더 빨리 발생합니다.

                                       UIImageView 바운스 애니메이션 Gif


16

암호:

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;

예:

코드의 UIImageView 예

더 재미 있고 더 장황한 솔루션 : ( 탭 전환 )

    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

이 시도:

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

스위프트 : _imageView.layer.addAnimation (CATransition (), forKey : kCATransition)
유진 브라기 넷

8

스위프트 3

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)
        }
    }
}

용법:

myImageView.imageWithFade = myImage

6

이것을 시도해보십시오.

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];

빠른 버전 :

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

이것은 UIImageView가 영원히 토글 링을 반복하도록 설정합니다 ... 저자는 그러나 변경을 요청했습니다 :(
J-Dizzle

setAnimationRepeatCount
William Hu

SetAnimationRepeatCount는 아무것도 변경하지 않습니다. 그것은 결코 멈추지
YUCEL 바이 람에게

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

여기에 몇 가지 다른 접근법이 있습니다. UIAnimations 내 기억에 당신의 도전처럼 들립니다.

편집 : 나에게 게으른 게 :)

포스트에서 나는이 방법을 언급했다 :

[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];

그러나 프레임을 애니메이션하는 대신 알파를 애니메이션합니다.

[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

iOS 5부터는 훨씬 쉽습니다.

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

4
즉, 이미지가 표시되어 있고, 새로운 이미지로 페이드를 교차 할 것입니다 원래의 문제를, 도움이되지 않습니다 ...
켄달 Helmstetter Gelner

4
맞습니다 ..이 답변은 질문을 해결하지 않습니다. 문제는 imageview에서 페이드하는 방법이 아니라 오래된 이미지에서 새로운 이미지로 페이드하는 것입니다. 애니메이션 블록은 iOS 4에서 도입되었습니다.
Bastian

2

스위프트 4 이건 정말 대단해

  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

블라디미르의 대답은 완벽하지만 신속한 솔루션을 찾고있는 나와 같은 사람

이 솔루션은 신속한 버전 4.2에서 작동합니다

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
    }

어디서나이 메소드를 호출 할 수 있습니다. 애니메이션이있는 이미지를 다음 이미지 (이미지)로 변경합니다.

대한 스위프트 버전 4.0 을 사용 울부 짖는 솔루션

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
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.