109 lines
4.6 KiB
Swift
109 lines
4.6 KiB
Swift
//
|
||
// JXSegmentedIndicatorBaseView.swift
|
||
// JXSegmentedView
|
||
//
|
||
// Created by jiaxin on 2018/12/26.
|
||
// Copyright © 2018 jiaxin. All rights reserved.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
public enum JXSegmentedIndicatorPosition {
|
||
case top
|
||
case bottom
|
||
case center
|
||
}
|
||
|
||
open class JXSegmentedIndicatorBaseView: UIView, JXSegmentedIndicatorProtocol {
|
||
/// 默认JXSegmentedViewAutomaticDimension(与cell的宽度相等)。内部通过getIndicatorWidth方法获取实际的值
|
||
open var indicatorWidth: CGFloat = JXSegmentedViewAutomaticDimension
|
||
open var indicatorWidthIncrement: CGFloat = 0 //指示器的宽度增量。比如需求是指示器宽度比cell宽度多10 point。就可以将该属性赋值为10。最终指示器的宽度=indicatorWidth+indicatorWidthIncrement
|
||
/// 默认JXSegmentedViewAutomaticDimension(与cell的高度相等)。内部通过getIndicatorHeight方法获取实际的值
|
||
open var indicatorHeight: CGFloat = JXSegmentedViewAutomaticDimension
|
||
/// 默认JXSegmentedViewAutomaticDimension (等于indicatorHeight/2)。内部通过getIndicatorCornerRadius方法获取实际的值
|
||
open var indicatorCornerRadius: CGFloat = JXSegmentedViewAutomaticDimension
|
||
/// 指示器的颜色
|
||
open var indicatorColor: UIColor = .red
|
||
/// 指示器的位置,top、bottom、center
|
||
open var indicatorPosition: JXSegmentedIndicatorPosition = .bottom
|
||
/// 垂直方向偏移,指示器默认贴着底部或者顶部,verticalOffset越大越靠近中心。
|
||
open var verticalOffset: CGFloat = 0
|
||
/// 手势滚动、点击切换的时候,是否允许滚动。
|
||
open var isScrollEnabled: Bool = true
|
||
/// 是否需要将当前的indicator的frame转换到cell。辅助JXSegmentedTitleDataSourced的isTitleMaskEnabled属性使用。
|
||
/// 如果添加了多个indicator,仅能有一个indicator的isIndicatorConvertToItemFrameEnabled为true。
|
||
/// 如果有多个indicator的isIndicatorConvertToItemFrameEnabled为true,则以最后一个isIndicatorConvertToItemFrameEnabled为true的indicator为准。
|
||
open var isIndicatorConvertToItemFrameEnabled: Bool = true
|
||
/// 点击选中时的滚动动画时长
|
||
open var scrollAnimationDuration: TimeInterval = 0.25
|
||
/// 指示器的宽度是否跟随item的内容变化(而不是跟着cell的宽度变化)。indicatorWidth=JXSegmentedViewAutomaticDimension才能生效
|
||
open var isIndicatorWidthSameAsItemContent = false
|
||
|
||
public override init(frame: CGRect) {
|
||
super.init(frame: frame)
|
||
|
||
commonInit()
|
||
}
|
||
|
||
required public init?(coder aDecoder: NSCoder) {
|
||
super.init(coder: aDecoder)
|
||
|
||
commonInit()
|
||
}
|
||
|
||
open func commonInit() {
|
||
}
|
||
|
||
public func getIndicatorCornerRadius(itemFrame: CGRect) -> CGFloat {
|
||
if indicatorCornerRadius == JXSegmentedViewAutomaticDimension {
|
||
return getIndicatorHeight(itemFrame: itemFrame)/2
|
||
}
|
||
return indicatorCornerRadius
|
||
}
|
||
|
||
public func getIndicatorWidth(itemFrame: CGRect, itemContentWidth: CGFloat) -> CGFloat {
|
||
if indicatorWidth == JXSegmentedViewAutomaticDimension {
|
||
if isIndicatorWidthSameAsItemContent {
|
||
return itemContentWidth + indicatorWidthIncrement
|
||
}else {
|
||
return itemFrame.size.width + indicatorWidthIncrement
|
||
}
|
||
}
|
||
return indicatorWidth + indicatorWidthIncrement
|
||
}
|
||
|
||
public func getIndicatorHeight(itemFrame: CGRect) -> CGFloat {
|
||
if indicatorHeight == JXSegmentedViewAutomaticDimension {
|
||
return itemFrame.size.height
|
||
}
|
||
return indicatorHeight
|
||
}
|
||
|
||
public func canHandleTransition(model: JXSegmentedIndicatorTransitionParams) -> Bool {
|
||
if model.percent == 0 || !isScrollEnabled {
|
||
//model.percent等于0时不需要处理,会调用selectItem(model: JXSegmentedIndicatorParamsModel)方法处理
|
||
//isScrollEnabled为false不需要处理
|
||
return false
|
||
}
|
||
return true
|
||
}
|
||
|
||
public func canSelectedWithAnimation(model: JXSegmentedIndicatorSelectedParams) -> Bool {
|
||
if isScrollEnabled && (model.selectedType == .click || model.selectedType == .code) {
|
||
//允许滚动且选中类型是点击或代码选中,才进行动画过渡
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
//MARK: - JXSegmentedIndicatorProtocol
|
||
open func refreshIndicatorState(model: JXSegmentedIndicatorSelectedParams) {
|
||
}
|
||
|
||
open func contentScrollViewDidScroll(model: JXSegmentedIndicatorTransitionParams) {
|
||
}
|
||
|
||
open func selectItem(model: JXSegmentedIndicatorSelectedParams) {
|
||
}
|
||
}
|