网上找到一个数字滚动的demo如下
原 demo 地址 地址
是OC版的,我照着人家的样,复制了一套Swift代码,如下:
//
// IWScrollNumberLabel.swift
// IWMe
//
// Created by 磊怀 on 2022/12/27.
//
import UIKit
enum ScrollAnimationDirection : Int {
case Up = 0
case Down = 1
case Number = 2
}
public class IWScrollNumberLabel: UIView {
public var displayerNumber : Int32 = 0
/*
tip:
* 通用1-4:是动态frame,无需设置frame,动态创建位数;
* 通用5-7:是限定位数,是以位数限定数值最大值;
* 通用8-9:是更新数值,设定动画时间等;
*/
/** 以下动态设置位数 **/
/**
通用1
@param originNumber 数值
@param size 字体大小
@return return value description
*/
public init(originNumber : Int32 , fontSize : CGFloat) {
super.init(frame: CGRect.zero)
self.initData(originNumber, fontSize, .mainColorBlack(), 0)
}
/**
通用2
@param originNumber 数值
@param size 字体大小
@param color 字体颜色
@return return value description
*/
public init(originNumber : Int32 , fontSize : CGFloat , textColor : UIColor) {
super.init(frame: CGRect.zero)
self.initData(originNumber, fontSize, textColor, 0)
}
/**
通用3
@param originNumber 数值
@param font 字体font
@return return value description
*/
public init(originNumber : Int32,font : UIFont) {
super.init(frame: CGRect.zero)
self.initData(originNumber, font, .mainColorBlack(), 0)
}
/**
通用4
@param originNumber 数值
@param font 字体font
@param color 字体颜色
@return return value description
*/
public init(originNumber : Int32,font : UIFont,textColor : UIColor) {
super.init(frame: CGRect.zero)
self.initData(originNumber, font, textColor, 0)
}
/** 以下限定位数 **/
/**
通用5
@param originNumber 数值
@param size 字体大小
@param rowNumber 位数
@return return value description
*/
public init(originNumber : Int32 , fontSize : CGFloat , rowNumber : Int) {
super.init(frame: CGRect.zero)
self.initData(originNumber, fontSize, .mainColorBlack(), rowNumber)
}
/**
通用6
@param originNumber 数值
@param size 字体大小
@param color 字体颜色
@param rowNumber 位数
@return return value description
*/
public init(originNumber : Int32 , fontSize : CGFloat ,textColor : UIColor , rowNumber : Int) {
super.init(frame: CGRect.zero)
self.initData(originNumber, fontSize, textColor, 0)
}
/**
通用7
@param originNumber 数值
@param font 字体设置
@param color 字体颜色
@param rowNumber 位数
@return return value description
*/
public init(originNumber : Int32 , font : UIFont ,textColor : UIColor , rowNumber : Int) {
super.init(frame: CGRect.zero)
self.initData(originNumber, font, textColor, rowNumber)
}
/** 以下是更新数值 **/
/**
通用8
@param number 数值+、-量
@param animated animated description
*/
public func changeToNumber(number : Int32 , animated : Bool) -> Void {
self.changeToNumber(number, 0, animated)
}
/**
通用9
@param number 数值+、-量
@param interval 动画时间设置
@param animated animated description
*/
public func changeToNumber(number : Int32 , interval : CGFloat , animated : Bool) -> Void {
self.changeToNumber(number, interval, animated)
}
// Attribute Key
private let keyRepeatCount : String = "repeatCount"
private let keyStartDuration : String = "startDuration"
private let keyCycleDuration : String = "cycleDuration"
private let keyEndDuration : String = "endDuration"
private let keyScrollCell : String = "scrollCell"
private let keyDisplayNumber : String = "displayNumber"
private let keyStartDelay : String = "startDelay"
// Task Key
private let keyTaskDisplayNumber : String = "displayNumber"
private let keyTaskChangeNumber : String = "changeNumber"
private let keyTaskInterval : String = "interval"
private let normalModulus : CGFloat = 0.3
private let bufferModulus : CGFloat = 0.7
private var cellArray : [UILabel] = Array.init()
private var fontSize : CGFloat = 0.0
private var rowNumber : Int = 0
private var taskArray : [Dictionary<String,CGFloat>] = Array.init()
private var isAnimation : Bool = true
private var cellWidth : CGFloat = 0.0
private var cellHeight : CGFloat = 0.0
private var finishedAnimationCount : Int = 1
private var maxRowNumber : Int = 0
private var textColor : UIColor = UIColor.mainColorBlack()
private var font : UIFont = UIFont.systemFont(ofSize: 16, weight: .bold)
private func initData(_ originNumber : Int32 , _ fontSize : CGFloat , _ textColor : UIColor , _ rowNumber : Int) -> Void {