Music_Player3/Pods/JXSegmentedView/Sources/Indicator/JXSegmentedIndicatorDoubleLineView.swift
2024-05-14 15:04:59 +08:00

110 lines
4.5 KiB
Swift

//
// JXSegmentedIndicatorDoubleLineView.swift
// JXSegmentedView
//
// Created by jiaxin on 2019/1/16.
// Copyright © 2019 jiaxin. All rights reserved.
//
import UIKit
open class JXSegmentedIndicatorDoubleLineView: JXSegmentedIndicatorBaseView {
/// 线
open var minLineWidthPercent: CGFloat = 0.2
public let selectedLineView: UIView = UIView()
public let otherLineView: UIView = UIView()
open override func commonInit() {
super.commonInit()
indicatorHeight = 3
addSubview(selectedLineView)
otherLineView.alpha = 0
addSubview(otherLineView)
}
open override func refreshIndicatorState(model: JXSegmentedIndicatorSelectedParams) {
super.refreshIndicatorState(model: model)
selectedLineView.backgroundColor = indicatorColor
otherLineView.backgroundColor = indicatorColor
selectedLineView.layer.cornerRadius = getIndicatorCornerRadius(itemFrame: model.currentSelectedItemFrame)
otherLineView.layer.cornerRadius = getIndicatorCornerRadius(itemFrame: model.currentSelectedItemFrame)
let width = getIndicatorWidth(itemFrame: model.currentSelectedItemFrame, itemContentWidth: model.currentItemContentWidth)
let height = getIndicatorHeight(itemFrame: model.currentSelectedItemFrame)
let x = model.currentSelectedItemFrame.origin.x + (model.currentSelectedItemFrame.size.width - width)/2
var y: CGFloat = 0
switch indicatorPosition {
case .top:
y = verticalOffset
case .bottom:
y = model.currentSelectedItemFrame.size.height - height - verticalOffset
case .center:
y = (model.currentSelectedItemFrame.size.height - height)/2 + verticalOffset
}
selectedLineView.frame = CGRect(x: x, y: y, width: width, height: height)
otherLineView.frame = selectedLineView.frame
}
open override func contentScrollViewDidScroll(model: JXSegmentedIndicatorTransitionParams) {
super.contentScrollViewDidScroll(model: model)
guard canHandleTransition(model: model) else {
return
}
let rightItemFrame = model.rightItemFrame
let leftItemFrame = model.leftItemFrame
let percent = model.percent
let leftCenter = getCenter(in: leftItemFrame)
let rightCenter = getCenter(in: rightItemFrame)
let leftMaxWidth = getIndicatorWidth(itemFrame: leftItemFrame, itemContentWidth: model.leftItemContentWidth)
let rightMaxWidth = getIndicatorWidth(itemFrame: rightItemFrame, itemContentWidth: model.rightItemContentWidth)
let leftMinWidth = leftMaxWidth*minLineWidthPercent
let rightMinWidth = rightMaxWidth*minLineWidthPercent
let leftWidth: CGFloat = JXSegmentedViewTool.interpolate(from: leftMaxWidth, to: leftMinWidth, percent: CGFloat(percent))
let rightWidth: CGFloat = JXSegmentedViewTool.interpolate(from: rightMinWidth, to: rightMaxWidth, percent: CGFloat(percent))
let leftAlpha: CGFloat = JXSegmentedViewTool.interpolate(from: 1, to: 0, percent: CGFloat(percent))
let rightAlpha: CGFloat = JXSegmentedViewTool.interpolate(from: 0, to: 1, percent: CGFloat(percent))
if model.currentSelectedIndex == model.leftIndex {
selectedLineView.bounds.size.width = leftWidth
selectedLineView.center = leftCenter
selectedLineView.alpha = leftAlpha
otherLineView.bounds.size.width = rightWidth
otherLineView.center = rightCenter
otherLineView.alpha = rightAlpha
}else {
otherLineView.bounds.size.width = leftWidth
otherLineView.center = leftCenter
otherLineView.alpha = leftAlpha
selectedLineView.bounds.size.width = rightWidth
selectedLineView.center = rightCenter
selectedLineView.alpha = rightAlpha
}
}
open override func selectItem(model: JXSegmentedIndicatorSelectedParams) {
super.selectItem(model: model)
let targetWidth = getIndicatorWidth(itemFrame: model.currentSelectedItemFrame, itemContentWidth: model.currentItemContentWidth)
let targetCenter = getCenter(in: model.currentSelectedItemFrame)
selectedLineView.bounds.size.width = targetWidth
selectedLineView.center = targetCenter
selectedLineView.alpha = 1
otherLineView.alpha = 0
}
private func getCenter(in frame: CGRect) -> CGPoint {
return CGPoint(x: frame.midX, y: selectedLineView.center.y)
}
}