MultiSelectSegmentedControl

Swift Version Build Status License CocoaPods Compatible
Platform PRs Welcome

UISegmentedControl 的改进版本,支持选择多个分段、垂直堆叠、组合文本和图像。

特性

用法

UISegmentedControl 非常相似,在大多数情况下可以作为直接替换。

如果您使用 Interface Builder,请添加一个普通的 UIView,然后将其类设置为 MultiSelectSegmentedControl

SwiftUI 用法

MultiSegmentPicker(
    selectedSegmentIndexes: $indexSet,
    items: ["One", "Two", image, [image2, "Text"], "Last"]
)

下面提到的属性可以作为参数传递给 MultiSegmentPicker 的初始化器,或者用作视图修饰符(例如,.borderWidth(3))。

创建分段

每个分段可以包含图像、文本或两者都包含

let multiSelect = MultiSelectSegmentedControl()
multiSelect.items = ["One", "Two", image, [image2, "Text"], "Last"]

图像以全彩色显示(与 UISegmentedControl 不同)。要使它们以与控件相同的 tintColor 渲染,请使用模板模式

multiSelect.items = [image1, image2, image3].map { $0.withRenderingMode(.alwaysTemplate) }

选择分段

multiSelect.selectedSegmentIndexes = [1, 2, 4]

或者仅单选

multiSelect.allowsMultipleSelection = false
multiSelect.selectedSegmentIndex = 3

获取选定的分段

let selectedIndices: IndexSet = multiSelect.selectedSegmentIndexes

或者获取标题

let titles: [String] = multiSelect.selectedSegmentTitles

处理用户选择更改

您可以使用标准的 target-action

multiSelect.addTarget(self, action: #selector(selectionChanged), for: .valueChanged)

或者遵循代理协议

extension MyViewController: MultiSelectSegmentedControlDelegate {
    func multiSelect(_ multiSelectSegmentedControl: MultiSelectSegmentedControl, didChange value: Bool, at index: Int) {
        print("selected \(value) at \(index)")
    }
}

... 并设置代理

multiSelect.delegate = self

更改外观

颜色

multiSelect.tintColor = .green

背景颜色(可选 - 如果背景颜色应与 tint 颜色不同,则使用)

multiSelect.selectedBackgroundColor = .blue

形状

multiSelect.borderWidth = 3 // Width of the dividers between segments and the border around the view.
multiSelect.borderRadius = 32 // Corner radius of the view.

垂直堆叠分段

multiSelect.isVertical = true

当每个分段同时包含图像和文本时,垂直堆叠其内容

multiSelect.isVerticalSegmentContents = true

文本样式

multiSelect.setTitleTextAttributes([.foregroundColor: UIColor.yellow], for: .selected)
multiSelect.setTitleTextAttributes([.obliqueness: 0.25], for: .normal)

更多标签样式

multiSelect.titleConfigurationHandler = {
    $0.numberOfLines = 0
    $0.lineBreakMode = .byWordWrapping
}

安装

CocoaPods

pod 'MultiSelectSegmentedControl'

Swift Package Manager

dependencies: [
    .package(url: "https://github.com/yonat/MultiSelectSegmentedControl", from: "2.4.1")
]

TODO

元数据

@yonatsharon

https://github.com/yonat/MultiSelectSegmentedControl