UISegmentedControl 的改进版本,支持选择多个分段、垂直堆叠、组合文本和图像。
与 UISegmentedControl
非常相似,在大多数情况下可以作为直接替换。
如果您使用 Interface Builder,请添加一个普通的 UIView
,然后将其类设置为 MultiSelectSegmentedControl
。
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
}
pod 'MultiSelectSegmentedControl'
dependencies: [
.package(url: "https://github.com/yonat/MultiSelectSegmentedControl", from: "2.4.1")
]
layoutMargins
, stackView.spacing