[iOS] UIImageView에서 교차 송전 같은 애니메이션을 실현하고 싶어요.

11205 단어 iOSSwift
안녕하세요.
다모창가 엔지니어
이번에는 교차 송전 애니메이션을 만들어야 한다는 통보를 받아 실현을 시도했다.
교차 피드백으로 여러 이미지 표시

실행 예


이런 느낌.

문제.

  • 프레임을 보내면 UIViewanimationImages를 사용할 수 있지만 피드도 안 돼요
  • 전달하려는 이미지를 동적으로 추가하기 위한 요구 사항
  • 해결책

  • 타이머를 사용하여 일정한 간격으로 이미지당 전송
  • 실현해 보았다


    CrossFade.swift

    import Foundation
    import UIKit
    
    class CrossFadeView: UIView {
        var animationView: UIImageView!
        var countNum = 0
        var images: Array<UIImage> = []
        var timer: NSTimer?
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            animationView = UIImageView.init(frame: frame)
            self.addSubview(animationView)
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func startCrossFade(duration: Float) {
            timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval.init(duration), target: self, selector: Selector("crossFade"), userInfo: nil, repeats: true)
        }
    
        func stopCrossFade() {
            if timer?.valid == true {
                timer?.invalidate()
            }
            timer = nil
        }
    
        func addImage(image: UIImage) {
            images.append(image)
        }
    
        func crossFade() {
            guard images.count > 0 else {
                return
            }
    
            let nextImage = images[countNum % images.count]
            let trans = CATransition.init()
            trans.duration = 1.0
            trans.type = kCATransitionFade
            animationView.layer.addAnimation(trans, forKey: nil)
            animationView.image = nextImage
            countNum++
        }
    }
    

    소환자

    import UIKit
    
    class ViewController: UIViewController {
        var crossFadeView: CrossFadeView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            crossFadeView = CrossFadeView.init(frame: CGRectMake(40, 100, 200, 200))
            crossFadeView.addImage(UIImage(named: "sample1")!)
            crossFadeView.addImage(UIImage(named: "sample2")!)
            self.view.addSubview(crossFadeView)
        }
    
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
            crossFadeView.startCrossFade(2.0)
        }
    
        override func viewWillDisappear(animated: Bool) {
            super.viewWillDisappear(animated)
            crossFadeView.stopCrossFade()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    

    미리 교차 피드백을 위한 이미지 배열 관리


    표시하고 싶은 이미지를 Array로 관리하면 편해요.2015/ 11/18追記그림의 크기가 커서 그룹에 추가하는 것을 주의해야 합니다.
    대량의 메모리를 점용하다.

    Timer로 반복 전송


    일정한 간격의 함수를 호출할 때 NSTimer의scheduledTimerWithTimeInterval는 매우 편리하다

    애니메이션 채널

    CATransition Fade 애니메이션이 준비되어 있어 편리함

    총결산


    편리합니다!최고!

    좋은 웹페이지 즐겨찾기