TagList,灵活的标签列表视图,易于使用和扩展。我爱你。
如果您不想使用上述任何依赖项管理器,您可以将TagList手动集成到项目中。
打开演示项目,构建并运行。
public protocol TagListDelegate: NSObjectProtocol {
func tagActionTriggered(tagList: TagList, action: TagAction, content: TagPresentable, index: Int)
func tagListUpdated(tagList: TagList)
}
public protocol TagPresentable {
var tag: String { get }
var isSelected: Bool { get set }
func createTagContent() -> TagContent
}
public protocol TagActionable {
var actionDelegate: TagActionDelegate? { get set }
}
public protocol TagActionDelegate: NSObjectProtocol {
func tagActionTriggered(action: TagAction)
}
public protocol TagStatable {
var stateDelegate: TagStateDelegate? { get set }
}
public protocol TagStateDelegate: NSObjectProtocol {
func tagSelected(_ isSelected: Bool)
}
protocol TagWrapperDelegate: TagActionable, TagActionDelegate, TagStatable, TagStateDelegate {
func wrap(target: TagContent) -> TagWrapper
func wrap(wrapper: TagWrapper) -> TagWrapper
}
import SwiftTagList
extension ViewController: TagListDelegate {
// Called when tagList's content changed
func tagListUpdated(tagList: TagList) {
...
}
// Tag interaction
func tagActionTriggered(tagList: TagList, action: TagAction, content: TagPresentable, index: Int) {
...
}
}
let view = TagList()
view.delegate = self
view.backgroundColor = UIColor.yellow
view.tagMargin = UIEdgeInsets(top: 3, left: 5, bottom: 3, right: 5)
view.separator.image = #imageLiteral(resourceName: "icon_arrow_right")
view.separator.size = CGSize(width: 16, height: 16)
view.separator.margin = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
...
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tagList.frame = CGRect(origin: CGPoint.zero, size: CGSize(width: areaList.frame.width, height: 0))
}
TagPresentableText, TagPresentableIcon 及 TagPresentableIconText 已实现,您可以直接使用,或者选择实现 TagPresentable 并继承 TagContent 创建自己的标签。
var delegate: TagListDelegate?
var tags: [Tag] = []
var horizontalAlignment: TagHorizontalAlignment = .left | .right | .center
var verticalAlignment: TagVerticalAlignment = .left | .right | .center
var tagMargin = UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)
var separator: SeparatorInfo = SeparatorInfo()
var isSeparatorEnabled = false
var isAutowrap = true
var selectionMode: TagSelectionMode = .none | .single | .multiple
func tagPresentables() -> [TagPresentable]
func selectedTagPresentables() -> [TagPresentable]
let tag = Tag(content: TagPresentableText("...") {
$0.label.font = UIFont.systemFont(ofSize: 16)
}, onInit: {
$0.padding = UIEdgeInsets(top: 8, left: 10, bottom: 8, right: 10)
$0.layer.borderColor = UIColor.cyan.cgColor
$0.layer.borderWidth = 2
$0.layer.cornerRadius = 5
}, onSelect: {
$0.backgroundColor = $0.isSelected ? UIColor.orange : UIColor.white
})
tag.wrappers = [TagWrapperRemover(onInit: {
$0.deleteButton.setImage(UIImage(named: "icon_delete")).withRenderingMode(.alwaysTemplate), for: .normal)
$0.space = 8
}) {
$0.deleteButton.tintColor = $1 ? UIColor.white : UIColor.black
}]
tagList.tags.append(tag)
init(content: TagPresentable, onInit: ((Tag) -> Void)? = nil, onSelect: ((Tag) -> Void)? = nil)
var content: TagPresentable { get }
var wrappers: [TagWrapper] = []
var padding: UIEdgeInsets = UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)
var isSelected: Bool
init(_ tag: String, onContentInit: ((TagContentText) -> Void)? = nil)
init(_ tag: String, icon: String, onContentInit: ((TagContentIcon) -> Void)? = nil)
init(_ tag: String, icon: String, onContentInit: ((TagContentIconText) -> Void)? = nil)
init(onInit: ((TagWrapperRemover) -> Void)? = nil, onSelect: ((TagWrapperRemover, Bool) -> Void)? = nil)
xiongxiong, [email protected]
TagList 根据MIT许可证提供。有关更多信息,请参阅LICENSE文件。