以下は、5秒ごとに異なる画像間を自動的に遷移するコードです。トランジションにアニメーションを追加したい、つまりフェード、左からスクロールなど。Swiftでこれを行うにはどうすればよいですか?ありがとう。
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.animationImages = [
UIImage(named: "brooklyn-bridge.jpg")!,
UIImage(named: "grand-central-terminal.jpg")!,
UIImage(named: "new-york-city.jpg")!,
UIImage(named: "one-world-trade-center.jpg")!,
UIImage(named: "rain.jpg")!,
UIImage(named: "wall-street.jpg")!]
imageView.animationDuration = 25.0
imageView.startAnimating()
}
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
let images = [
UIImage(named: "brooklyn-bridge.jpg")!,
UIImage(named: "grand-central-terminal.jpg")!,
UIImage(named: "new-york-city.jpg"),
UIImage(named: "one-world-trade-center.jpg")!,
UIImage(named: "rain.jpg")!,
UIImage(named: "wall-street.jpg")!]
var index = 0
let animationDuration: NSTimeInterval = 0.25
let switchingInterval: NSTimeInterval = 3
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = images[index++]
animateImageView()
}
func animateImageView() {
CATransaction.begin()
CATransaction.setAnimationDuration(animationDuration)
CATransaction.setCompletionBlock {
let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(self.switchingInterval * NSTimeInterval(NSEC_PER_SEC)))
dispatch_after(delay, dispatch_get_main_queue()) {
self.animateImageView()
}
}
let transition = CATransition()
transition.type = kCATransitionFade
/*
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
*/
imageView.layer.addAnimation(transition, forKey: kCATransition)
imageView.image = images[index]
CATransaction.commit()
index = index < images.count - 1 ? index + 1 : 0
}
}
カスタムイメージビューとして実装することをお勧めします。
Swift 3の this answer に基づくアニメーションコード
let animationDuration: TimeInterval = 0.25
let switchingInterval: TimeInterval = 3
func animateImageView()
{
CATransaction.begin()
CATransaction.setAnimationDuration(animationDuration)
CATransaction.setCompletionBlock {
DispatchQueue.main.asyncAfter(deadline: .now() + self.switchingInterval) {
self.animateImageView()
}
}
let transition = CATransition()
transition.type = kCATransitionFade
/*
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
*/
imageView.layer.add(transition, forKey: kCATransition)
imageView.image = images.object(at: index) as! UIImage
CATransaction.commit()
index = index < images.count - 1 ? index + 1 : 0
}
これは、フェードアニメーションで画像の変化をアニメーション化するために使用できるスタンドアロンクラスです。
class FadeImageView: UIImageView
{
@IBInspectable
var fadeDuration: Double = 0.13
override var image: UIImage?
{
get {
return super.image
}
set(newImage)
{
if let img = newImage
{
CATransaction.begin()
CATransaction.setAnimationDuration(self.fadeDuration)
let transition = CATransition()
transition.type = kCATransitionFade
super.layer.add(transition, forKey: kCATransition)
super.image = img
CATransaction.commit()
}
else {
super.image = nil
}
}
}
}