iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 5
0

ImageSlider

通過一些簡單的動畫,可以讓圖片在切換的過程變得有趣許多。


ImageSlider

在 ViewController 的正中央放置一個 UIImageView 用來顯示準備好的6張圖片。
https://ithelp.ithome.com.tw/upload/images/20171224/20107329u2G2YYCCOL.png

目標:

  • 每 1.5 秒切換一次圖片(共有6張圖)
  • 每次切換圖片的時候都能夠完整的顯示圖片並且位居畫面正中央。

ImageSliderView

自定義一個繼承於 UIImageView 的 ImageSliderView 在這個 class 中實現切換圖片的動畫。

func setImage(_ newImage:UIImage, animated: Bool) {
    if animated {
        let animation = CABasicAnimation(keyPath: "contents")
        animation.fromValue = image?.cgImage
        animation.toValue = newImage.cgImage
        animation.duration = defaultDuration
        
        layer.contents = image?.cgImage
        layer.add(animation, forKey: nil)
    }
    
    image = newImage
}

HomeViewController

在畫面中央放置 ImageSliderView 並且啟動 timer 每 1.5秒執行一次切換圖片的動畫

private func setupView() {
    // setup imageSliderView
    let screen = UIScreen.main.bounds
    let image = images[0]
    let imageWidth =  screen.width - 20
    let imageHeight = ((screen.width - 20) / image.size.width) * image.size.height
    imageSliderView = ImageSliderView(frame: CGRect(x: 0, y: 0, width: imageWidth, height: imageHeight))
    imageSliderView.center = CGPoint(x: view.bounds.width / 2, y: view.bounds.height / 2)
    imageSliderView.layer.borderWidth = 3
    imageSliderView.layer.borderColor = UIColor.black.cgColor
    imageSliderView.setImage(image, animated: false)
    view.addSubview(imageSliderView)
    
    // setup timer
    timer = Timer.scheduledTimer(timeInterval: 1.5, target: self, selector: #selector(HomeViewController.changeImageEvent), userInfo: nil, repeats: true)
}

通過取餘數的方法讓 nextPos 處於 0~5之間,取完圖片再讓 currentPos 前進一位。

圖片切換的動畫依舊是通過 UiView.animate 方法,改變最終 imageSliderView 的 bounds 系統就會幫將過程變成動畫。

要記得重新設定一次 center 讓圖片維持在畫面正中央。

@objc func changeImageEvent() {
    // take next image
    let nextPos = currentPos % images.count
    currentPos += 1
    imageSliderView.setImage(images[nextPos], animated: true)
    
    // image changing animation
    let screen = UIScreen.main.bounds
    UIView.animate(withDuration: 0.5, animations: {
        // calculate new iamge bounds
        let imageWidth =  screen.width - 20
        let imageHeight = ((screen.width - 20) / self.imageSliderView.image!.size.width) * self.imageSliderView.image!.size.height
        var tempRect = self.imageSliderView.bounds
        tempRect.size = CGSize(width: imageWidth, height: imageHeight)
        
        // update imageSliderView's bounds & center
        self.imageSliderView.bounds = tempRect
        self.imageSliderView.center = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2)
    })
}

參考


上一篇
Expandable Buttons - 折疊式按鈕
下一篇
Parallax Scrolling - 橫向捲動視差
系列文
iOS Swift x Layout x Animation x Transition30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言