测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新版本 | 2017年8月 |
SwiftSwift 版本 | 3.0 |
SPM支持 Swift Package Manager | ✗ |
由 hailiang.song 维护。
UIDefaultSegmentControl 的替换品。使用 Swift 3.0 编写。深受 HMSegmentedControl 启发。
如下代码所示:
let segment = NLSegmentControl(frame: CGRect(x: 0, y: 80, width: UIScreen.main.bounds.width, height: 40))
segment.segments = ["One Day", "Two", "Three", "Four dogs", "Five fingers", "Six trees", "Seven", "Eight", "Nine", "Ten"]
segment.indexChangedHandler = {
(index) in
print("index changed: \(index)")
}
self.view.addSubview(segment)
segment.reloadSegments()
更多示例请查看演示项目。
segment.segments = ["Trending", "News", "Library"]
segment.segments = [UIImage(named: "baby")!,UIImage(named: "bag")!,UIImage(named: "diamond")!]
如果需要为选中的分段设置选中图像,请尝试以下操作:
let item1 = NLSegmentItem(image: UIImage(named: "baby"), selectedImage: UIImage(named: "baby_s"))
let item2 = NLSegmentItem(image: UIImage(named: "bag"), selectedImage: UIImage(named: "bag_s"))
let item3 = NLSegmentItem(image: UIImage(named: "diamond"), selectedImage:UIImage(named: "diamond_s"))
segment.segments = [item1, item2, item3]
1. 使用 NLSegmentItem 结构体
注意:`title`、`image`、`selectedImage` 都是可选的
let item1 = NLUISegmentItem(title: "Baby", image: UIImage(named: "baby"), selectedImage: UIImage(named: "baby_s"))
let item2 = NLUISegmentItem(title: "Bag", image: UIImage(named: "bag"), selectedImage: UIImage(named: "bag_s"))
let item3 = NLUISegmentItem(title: "Diamond", image: UIImage(named: "diamond"), selectedImage: UIImage(named: "diamond_s"))
segment.segments = [item1, item2, item3]
2. 使用您自己的数据模型,只需使其实现 NLSegment
协议。
struct Category {
var categoryTitle: String?
var categoryImage: String?
var categorySelectedImage: String?
init(title: String? = nil, image: String? = nil, selectedImage: String? = nil) {
self.categoryTitle = title
self.categoryImage = image
self.categorySelectedImage = selectedImage
}
}
extension Category: NLSegment {
var segmentTitle: String? {
return categoryTitle
}
var segmentImage: UIImage? {
if let img = categoryImage {
return UIImage(named: img)
}
return nil
}
var segmentSelectedImage: UIImage? {
if let img = categorySelectedImage {
return UIImage(named: img)
}
return nil
}
}
let item1 = Category(title: "Baby", image: "baby", selectedImage: "baby_s")
let item2 = Category(title: "Bag", image: "bag", selectedImage: "bag_s")
let item3 = Category(title: "Diamond", image: "diamond", selectedImage: "diamond_s")
segment.segments = [item1, item2, item3]
设置 `segmentTitleFormatter` 属性,您可以为每个分段设置任何您想要的属性。如果返回 nil,分段将使用常见的 `titleTextAttributes` 属性。
attrSegment.segmentTitleFormatter = {
(segment, selected) -> NSAttributedString? in
if let cate = segment as? Category {
let title = cate.categoryTitle ?? ""
let desc = cate.categoryDesc != nil ? "\n" + cate.categoryDesc! : ""
let titleRange = NSRange(location: 0, length: title.count)
let descRange = NSRange(location: title.count, length: desc.count)
let attr = NSMutableAttributedString(string: title + desc)
attr.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 18), range: titleRange)
attr.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 10), range: descRange)
if selected {
attr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: descRange)
} else {
attr.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue, range: descRange)
}
return attr
}
return nil
}
分段宽度样式
fixed
:每个分段宽度相等,等于最宽分段的宽度。dynamic
:每个分段宽度不同,取决于其内容。equal(width)
:每个分段宽度相等,等于宽度参数。选择指示符
selectionIndicatorStyle
:选择指示符风格,支持 textWidthStripe
、fullWidthStripe
、box
selectionIndicatorHeight
:选择指示符的高度selectionIndicatorEdgeInset
:选择指示符的边距selectionIndicatorColor
:选择指示符的颜色selectionIndicatorPosition
:选择指示符的位置,支持 top
、bottom
、none
selectionBoxColor
:选择框的颜色字体 & 颜色
titleTextAttributes
:用于未选择段落标签的文本属性selectedTitleTextAttributes
:用于选择段落标签的文本属性垂直分隔线
enableVerticalDivider
:启用段落间的垂直分隔线verticalDividerColor
:垂直分隔线的颜色verticalDividerWidth
:垂直分隔线的宽度verticalDividerInset
:垂直分隔线的上下边距图片和文本
imagePosition
:与文本相对的图片位置imageTitleSpace
:图片和标题之间的间距NLSegment
协议作为数据源titles
、images
、selectedImages
属性selectedSegmentIndex
属性更新为公开