Music_Player3/Pods/JXSegmentedView/Sources/Title/JXSegmentedTitleDataSource.swift
2024-06-03 09:48:39 +08:00

203 lines
10 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// JXSegmentedTitleView.swift
// JXSegmentedView
//
// Created by jiaxin on 2018/12/26.
// Copyright © 2018 jiaxin. All rights reserved.
//
import UIKit
open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource {
/// title
open var titles = [String]()
/// indexcell
open var configuration: JXSegmentedTitleDynamicConfiguration?
/// JXSegmentedViewUITableViewcellJXSegmentedViewreloadDatatitleUITableViewcellModeltitlesJXSegmentedView
open var widthForTitleClosure: ((String)->(CGFloat))?
/// labelnumberOfLines
open var titleNumberOfLines: Int = 1
/// titletextColor
open var titleNormalColor: UIColor = .black
/// titletextColor
open var titleSelectedColor: UIColor = .red
/// title
open var titleNormalFont: UIFont = UIFont.systemFont(ofSize: 15)
/// titletitleNormalFont
open var titleSelectedFont: UIFont?
/// title
open var isTitleColorGradientEnabled: Bool = false
/// title使titleNormalFonttitleSelectedFont
open var isTitleZoomEnabled: Bool = false
/// isTitleZoomEnabledtruetitleNormalFontpointSize1010*1.2=12
open var titleSelectedZoomScale: CGFloat = 1.2
/// title线使titleNormalFonttitleSelectedFont
open var isTitleStrokeWidthEnabled: Bool = false
/// NSStrokeWidthAttributeName
open var titleSelectedStrokeWidth: CGFloat = -2
/// title使
open var isTitleMaskEnabled: Bool = false
open override func preferredItemCount() -> Int {
return titles.count
}
open override func preferredItemModelInstance() -> JXSegmentedBaseItemModel {
return JXSegmentedTitleItemModel()
}
open override func preferredRefreshItemModel( _ itemModel: JXSegmentedBaseItemModel, at index: Int, selectedIndex: Int) {
super.preferredRefreshItemModel(itemModel, at: index, selectedIndex: selectedIndex)
guard let myItemModel = itemModel as? JXSegmentedTitleItemModel else {
return
}
myItemModel.title = titles[index]
myItemModel.textWidth = widthForTitle(myItemModel.title ?? "", index)
myItemModel.titleNumberOfLines = innerTitleNumberOfLines(at: index)
myItemModel.isSelectedAnimable = isSelectedAnimable
myItemModel.titleNormalColor = innerTitleNormalColor(at: index)
myItemModel.titleSelectedColor = innerTitleSelectedColor(at: index)
myItemModel.titleNormalFont = innerTitleNormalFont(at: index)
if let selectedFont = innerTitleSelectedFont(at: index) {
myItemModel.titleSelectedFont = selectedFont
} else {
myItemModel.titleSelectedFont = innerTitleNormalFont(at: index)
}
myItemModel.isTitleZoomEnabled = isTitleZoomEnabled
myItemModel.isTitleStrokeWidthEnabled = isTitleStrokeWidthEnabled
myItemModel.isTitleMaskEnabled = isTitleMaskEnabled
myItemModel.titleNormalZoomScale = 1
myItemModel.titleSelectedZoomScale = titleSelectedZoomScale
myItemModel.titleSelectedStrokeWidth = titleSelectedStrokeWidth
myItemModel.titleNormalStrokeWidth = 0
if index == selectedIndex {
myItemModel.titleCurrentColor = innerTitleSelectedColor(at: index)
myItemModel.titleCurrentZoomScale = titleSelectedZoomScale
myItemModel.titleCurrentStrokeWidth = titleSelectedStrokeWidth
}else {
myItemModel.titleCurrentColor = innerTitleNormalColor(at: index)
myItemModel.titleCurrentZoomScale = 1
myItemModel.titleCurrentStrokeWidth = 0
}
}
open func widthForTitle(_ title: String, _ index: Int) -> CGFloat {
if widthForTitleClosure != nil {
return widthForTitleClosure!(title)
}else {
let textWidth = NSString(string: title).boundingRect(with: CGSize(width: CGFloat.infinity, height: CGFloat.infinity), options: [.usesFontLeading, .usesLineFragmentOrigin], attributes: [NSAttributedString.Key.font : innerTitleNormalFont(at: index)], context: nil).size.width
return CGFloat(ceilf(Float(textWidth)))
}
}
/// `preferredRefreshItemModel( _ itemModel: JXSegmentedBaseItemModel, at index: Int, selectedIndex: Int)`使
open override func preferredSegmentedView(_ segmentedView: JXSegmentedView, widthForItemAt index: Int) -> CGFloat {
var width = super.preferredSegmentedView(segmentedView, widthForItemAt: index)
if itemWidth == JXSegmentedViewAutomaticDimension {
width += (dataSource[index] as! JXSegmentedTitleItemModel).textWidth
}else {
width += itemWidth
}
return width
}
//MARK: - JXSegmentedViewDataSource
open override func registerCellClass(in segmentedView: JXSegmentedView) {
segmentedView.collectionView.register(JXSegmentedTitleCell.self, forCellWithReuseIdentifier: "cell")
}
open override func segmentedView(_ segmentedView: JXSegmentedView, cellForItemAt index: Int) -> JXSegmentedBaseCell {
let cell = segmentedView.dequeueReusableCell(withReuseIdentifier: "cell", at: index)
return cell
}
public override func segmentedView(_ segmentedView: JXSegmentedView, widthForItemContentAt index: Int) -> CGFloat {
let model = dataSource[index] as! JXSegmentedTitleItemModel
if isTitleZoomEnabled {
return model.textWidth*model.titleCurrentZoomScale
}else {
return model.textWidth
}
}
open override func refreshItemModel(_ segmentedView: JXSegmentedView, leftItemModel: JXSegmentedBaseItemModel, rightItemModel: JXSegmentedBaseItemModel, percent: CGFloat) {
super.refreshItemModel(segmentedView, leftItemModel: leftItemModel, rightItemModel: rightItemModel, percent: percent)
guard let leftModel = leftItemModel as? JXSegmentedTitleItemModel, let rightModel = rightItemModel as? JXSegmentedTitleItemModel else {
return
}
if isTitleZoomEnabled && isItemTransitionEnabled {
leftModel.titleCurrentZoomScale = JXSegmentedViewTool.interpolate(from: leftModel.titleSelectedZoomScale, to: leftModel.titleNormalZoomScale, percent: CGFloat(percent))
rightModel.titleCurrentZoomScale = JXSegmentedViewTool.interpolate(from: rightModel.titleNormalZoomScale, to: rightModel.titleSelectedZoomScale, percent: CGFloat(percent))
}
if isTitleStrokeWidthEnabled && isItemTransitionEnabled {
leftModel.titleCurrentStrokeWidth = JXSegmentedViewTool.interpolate(from: leftModel.titleSelectedStrokeWidth, to: leftModel.titleNormalStrokeWidth, percent: CGFloat(percent))
rightModel.titleCurrentStrokeWidth = JXSegmentedViewTool.interpolate(from: rightModel.titleNormalStrokeWidth, to: rightModel.titleSelectedStrokeWidth, percent: CGFloat(percent))
}
if isTitleColorGradientEnabled && isItemTransitionEnabled {
leftModel.titleCurrentColor = JXSegmentedViewTool.interpolateThemeColor(from: leftModel.titleSelectedColor, to: leftModel.titleNormalColor, percent: percent)
rightModel.titleCurrentColor = JXSegmentedViewTool.interpolateThemeColor(from:rightModel.titleNormalColor , to:rightModel.titleSelectedColor, percent: percent)
}
}
open override func refreshItemModel(_ segmentedView: JXSegmentedView, currentSelectedItemModel: JXSegmentedBaseItemModel, willSelectedItemModel: JXSegmentedBaseItemModel, selectedType: JXSegmentedViewItemSelectedType) {
super.refreshItemModel(segmentedView, currentSelectedItemModel: currentSelectedItemModel, willSelectedItemModel: willSelectedItemModel, selectedType: selectedType)
guard let myCurrentSelectedItemModel = currentSelectedItemModel as? JXSegmentedTitleItemModel, let myWillSelectedItemModel = willSelectedItemModel as? JXSegmentedTitleItemModel else {
return
}
myCurrentSelectedItemModel.titleCurrentColor = myCurrentSelectedItemModel.titleNormalColor
myCurrentSelectedItemModel.titleCurrentZoomScale = myCurrentSelectedItemModel.titleNormalZoomScale
myCurrentSelectedItemModel.titleCurrentStrokeWidth = myCurrentSelectedItemModel.titleNormalStrokeWidth
myCurrentSelectedItemModel.indicatorConvertToItemFrame = CGRect.zero
myWillSelectedItemModel.titleCurrentColor = myWillSelectedItemModel.titleSelectedColor
myWillSelectedItemModel.titleCurrentZoomScale = myWillSelectedItemModel.titleSelectedZoomScale
myWillSelectedItemModel.titleCurrentStrokeWidth = myWillSelectedItemModel.titleSelectedStrokeWidth
}
// MARK: - Configuration
private func innerTitleNumberOfLines(at index: Int) -> Int {
if let configuration {
return configuration.titleNumberOfLines(at: index)
} else {
return titleNumberOfLines
}
}
private func innerTitleNormalColor(at index: Int) -> UIColor {
if let configuration {
return configuration.titleNormalColor(at: index)
} else {
return titleNormalColor
}
}
private func innerTitleSelectedColor(at index: Int) -> UIColor {
if let configuration {
return configuration.titleSelectedColor(at: index)
} else {
return titleSelectedColor
}
}
private func innerTitleNormalFont(at index: Int) -> UIFont {
if let configuration {
return configuration.titleNormalFont(at: index)
} else {
return titleNormalFont
}
}
private func innerTitleSelectedFont(at index: Int) -> UIFont? {
if let configuration {
return configuration.titleSelectedFont(at: index)
} else {
return titleSelectedFont
}
}
}