SSCycleScrollView 2.1.1

SSCycleScrollView 2.1.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2018 年 7 月
SPM支持 SPM

ShawnDu 维护。



  • Shawn Du

swift首页轮播 轻量级

  • 轮播终结者,使用 swift 完成,易于集成使用,下载图片使用了 SDWebImage
  • 我自己动手用 swift 写了一个,欢迎试用!
  • 效果图:

在网上找了一些首页轮播,写的或多或少有一些问题,用着不舒服,自己用 Swift 写了一个轮播控件,有以下特点:

  • 下载图片使用了 SDWebImage,性能高
  • 轮播图上需要点击链接,只需要调用一个 block 便可以添加点击,易于集成
  • 支持 webp 格式图片,由于加入了支持 webp,电脑需要翻墙才能安装,请在此更改电脑上的 hosts

使用方法

在 Podfile 中添加以下内容:

use_frameworks!
pod 'SSCycleScrollView'

这个库支持 webp 格式图片,并引入了 SDWebImage 库。下面可以参考 Demo 中的示例:初始化时,传递一个包含 url 的数组,可以传递本地图片的名称,也可以传递网络图片;v2.1.0 中引入了网络图片的 placeholderImage,将此数组更改为以下样式:

var scrollImageUrls: [[String]] {
        get {
            return [["https://devthinking.com/images/wechatqcode.jpg", "banner4.jpg"],
                    ["banner1.jpg"],
                    ["banner3.jpg"]]
        }
    }

初始化一个 SSCycleScrollView

        self.mainScrollView = SSCycleScrollView.init(frame: currentRect, animationDuration: 3, inputImageUrls: self.scrollImageUrls)
        self.mainScrollView?.tapBlock = {index in
            print("tapped page\(index)")
        }

autoScroll 默认为 true,如果只需要手动滚动,则:

       self.mainScrollView?.autoScroll = false

SSCycleScrollView 原理

初始化后会启动一个定时器,不断调用 timerFired 方法,每次对 scrollView 添加一个自己的宽度 offset

func timerFired() {
let xOffset = Int(self.contentOffset.x/kScreenWidth)
let xOffsetFloat = CGFloat(xOffset) * kScreenWidth
let newOffset = CGPointMake(xOffsetFloat + CGRectGetWidth(self.frame), self.contentOffset.y)
self.setContentOffset(newOffset, animated: true)
}

没有直接添加 xOffset,而是进行了一个换算,确保每次添加的 offset 是自己宽度的整数倍。在 scrollViewDidScroll 方法中,每次计算前一个、当前、后一个 index,确保 index 的范围是 index >= 0 && index < allImageArray.count,每次滚动后都会重新分配三个 imageView 中的 image:

self.previousDisplayView?.image = self.allImageArray[previousArrayIndex]
self.currentDisplayView?.image = self.allImageArray[self.currentArrayIndex]
self.lastDisplayView?.image = self.allImageArray[lastArrayIndex]
self.contentOffset = CGPointMake(CGRectGetWidth(self.frame), 0)

上面最后一行设置 contentOffset 非常重要,每次将 scrollView 位置重置为一个自身宽度的 offset。

小结

如果你觉得有不好的地方,可以提出来,大家一起研究一下,欢迎常来我的仓库,别忘了给个star!

微信公众号

开发者思维 devthinking

QQ交流群:295976280

iOS交流群(一)群二维码