测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2016年11月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Sunshinejr 维护。
SwiftCarousel 是一个轻量级的,用 Swift 语言原生编写的圆形 UIScrollView。
那么,这比一个圆形滚动视图多出什么?你可以像真正的旋转木马一样旋转它!
Swift 2.0, iOS 9
SwiftCarousel 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod "SwiftCarousel"
然后运行 pod install
,它应该import SwiftCarousel
。
您可以在 Examples 目录中找到使用 IB 或代码创建 SwiftCarousel 的示例。
首先,创建一个 UIView
对象,并将其分配给 SwiftCarousel
类。然后我们需要分配一些可选择的 UIViews
。这可能是 UILabels
、UIImageViews
等。最后一步是设置正确的 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
方法中。这会使用 NSKeyedUnarchiver
和 NSKeyedArchiver
执行视图的浅复制。因此,如果使用具有对外部对象引用的自定义 UIView
子类,那么在调用 didSelectItem
和 didDeselectItem
委托方法时,这些引用可能为 nil。为了避免这种情况,可以使用而不是 items
属性的 itemsFactory
方法来设置滚动视图。
如果您有任何问题、改进的想法或可能发现的问题,请随时创建问题/拉取请求。在做出一些贡献之后,我会作为感谢给予您写入权限。
Sunshinejr, [email protected], @thesunshinejr
SwiftCarousel 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。