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 3 및 Swift 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.