A lightweight UIView for getting smooth rolling animation between numbers implemented using only CALayer

RollingNumbers

RollingNumbers is a lightweight UIView for getting smooth rolling animation between numbers implemented using only CALayer.

In Triumph Arcade building Triumph SDK for game developers. I had a task to create Rolling Numbers animation for a balance component. Sometimes we cannot afford to use third-party libraries, so I decided to make my own solution using only CALayers in purpose to avoid performance issues.

Requirements

  • iOS 11.0+
  • Swift 5.0+

Instalation

Cocoapod

RollingNumbers is available through CocoaPods:

pod 'RollingNumbers'

Swift Package Manager

https://github.com/maxkalik/RollingNumbers.git

Usage

Initialize a RollingNumbersView.

let view = RollingNumbersView()

Set number with animation

rollingNumbersView.setNumberWithAnimation(1234.56)

Set number without animation

rollingNumbersView.setNumber(1234.56)

Configuration

var rollingNumbersView = {
    // Initialize Rolling Numbers view with initial number value
    let view = RollingNumbersView(number: 1234.56)
    
    // Configure animation type
    view.animationType = .onlyChangedDigits
    
    // Rolling direction will scroll only up
    view.rollingDirection = .up
    
    // Spacing between numbers
    view.characterSpacing = 1
    
    // Text color
    view.textColor = .black
    
    // Alignment within UIView
    view.alignment = .left
    
    // UIFont
    view.font = .systemFont(ofSize: 48, weight: .medium)
    
    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    view.formatter = formatter
    
    return view
}()

Animation Type

Type Description
allNumbers All numbers roll if even only one number change
onlyChangedNumbers Only changed numbers roll
allAfterFirstChangedNumber All numbers roll after first changed number
noAnimation Numbers change without animation

Animation Direction

Type Description
up Rolling animation direction from up to down
down Rolling animation direction from down to up

Specific Configureation

Set text color with animation with optional transition duration between existing color and the next one.

rollingNumbersView.setTextColor(.blue, withAnimationDuration: 3)

Animation Configuration

rollingNumbersView.animationConfiguration = RollingNumbersView.AnimationConfiguration(
    duration: 3,
    speed: 0.3,
    damping: 17,
    initialVelocity: 1
)

Completion

Use completion for each numbers animation

rollingNumbersView.setNumberWithAnimation(245699) {
    // completion
}

Contributing

Be welcome to contribute to this project!

License

This project was released under the MIT license.

Author

Max Kalik, maxkalik@gmail.com

GitHub

View Github