SwiftCarousel 0.8.0

SwiftCarousel 0.8.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2016年11月
SwiftSwift 版本3.0
SPM支持 SPM

Sunshinejr 维护。



SwiftCarousel


由于时间关系,我不再能真正维护这个项目了——如果有任何人愿意接手,请联系我。😓如果有谁愿意接手,请与我联系。


SwiftCarousel 是一个轻量级的,用 Swift 语言原生编写的圆形 UIScrollView。
那么,这比一个圆形滚动视图多出什么?你可以像真正的旋转木马一样旋转它!

SwiftCarousel example SwiftCarousel example

要求

Swift 2.0, iOS 9

安装

SwiftCarousel 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中

pod "SwiftCarousel"

然后运行 pod install,它应该🔥还要记得在项目中添加 import SwiftCarousel

示例

您可以在 Examples 目录中找到使用 IB 或代码创建 SwiftCarousel 的示例。

使用 Interface Builder(Storyboard/xibs)的基本用法

首先,创建一个 UIView 对象,并将其分配给 SwiftCarousel 类。然后我们需要分配一些可选择的 UIViews。这可能是 UILabelsUIImageViews 等。最后一步是设置正确的 resizeType 参数,它包含

public enum SwiftCarouselResizeType {
    // WithoutResizing is adding frames as they are.
    // Parameter = spacing between UIViews.
    // !!You need to pass correct frame sizes as items!!
    case WithoutResizing(CGFloat)

    // VisibleItemsPerPage will try to fit the number of items you specify
    // in the whole screen (will resize them of course).
    // Parameter = number of items visible on screen.
    case VisibleItemsPerPage(Int)

    // FloatWithSpacing will use sizeToFit() on your views to correctly place images
    // It is helpful for instance with UILabels (Example1 in Examples folder).
    // Parameter = spacing between UIViews.
    case FloatWithSpacing(CGFloat)
}

基本设置如下所示

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    items = ["Elephants", "Tigers", "Chickens", "Owls", "Rats", "Parrots", "Snakes"]
    itemsViews = items!.map { labelForString($0) }
    carousel.items = itemsViews!
    carousel.resizeType = .VisibleItemsPerPage(3)
    carousel.defaultSelectedIndex = 3 // Select default item at start
    carousel.delegate = self
}

func labelForString(string: String) -> UILabel {
    let text = UILabel()
    text.text = string
    text.textColor = .blackColor()
    text.textAlignment = .Center
    text.font = .systemFontOfSize(24.0)
    text.numberOfLines = 0

    return text
}

纯代码的基本用法

这里我们使用 itemsFactory(itemsCount:facory:) 方法。此方法允许您使用闭包而不是静态视图数组设置轮播图。我们为什么要这样做?在逻辑相当复杂的情况下。例如,如果你想要在轮播图的每一项中都有 CALayer 属性。

let carouselFrame = CGRect(x: view.center.x - 200.0, y: view.center.y - 100.0, width: 400.0, height: 200.0)
carouselView = SwiftCarousel(frame: carouselFrame)
try! carouselView.itemsFactory(itemsCount: 5) { choice in
    let imageView = UIImageView(image: UIImage(named: "puppy\(choice+1)"))
    imageView.frame = CGRect(origin: CGPointZero, size: CGSize(width: 200.0, height: 200.0))

    return imageView
}
carouselView.resizeType = .WithoutResizing(10.0)
carouselView.delegate = self
carouselView.defaultSelectedIndex = 2
view.addSubview(carouselView)

附加方法、属性 & 委托

您可以使用方法 selectItem(_:animated:) 来编程选择您的项

carousel.selectItem(1, animated: true)

或者您可以设置默认选中的项

carousel.defaultSelectedIndex = 3

您可以禁用通过点击来选择项(默认为启用)

carousel.selectByTapEnabled = false

您还可以获取当前选中的索引

let selectedIndex = carousel.selectedIndex

您可以实现 SwiftCarouselDelegate 协议

@objc public protocol SwiftCarouselDelegate {
    optional func didSelectItem(item item: UIView, index: Int, tapped: Bool) -> UIView?
    optional func didDeselectItem(item item: UIView, index: Int) -> UIView?
    optional func didScroll(toOffset offset: CGPoint) -> Void
    optional func willBeginDragging(withOffset offset: CGPoint) -> Void
    optional func didEndDragging(withOffset offset: CGPoint) -> Void
}

然后您需要设置 delegate 属性

carousel.delegate = self

更多基本用法请参考 Examples 目录中的 Example1 项目。

已知限制

在使用 items 属性时,原始视图被内部复制到使用在 UIView+SwiftCarousel 扩展中定义的 copyView 方法中。这会使用 NSKeyedUnarchiverNSKeyedArchiver 执行视图的浅复制。因此,如果使用具有对外部对象引用的自定义 UIView 子类,那么在调用 didSelectItemdidDeselectItem 委托方法时,这些引用可能为 nil。为了避免这种情况,可以使用而不是 items 属性的 itemsFactory 方法来设置滚动视图。

贡献

如果您有任何问题、改进的想法或可能发现的问题,请随时创建问题/拉取请求。在做出一些贡献之后,我会作为感谢给予您写入权限。🎉

作者

Sunshinejr, [email protected], @thesunshinejr

许可

SwiftCarousel 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。