bar indicator add

This commit is contained in:
Kevin G Christiano 2020-02-13 12:47:07 -05:00
parent 4bfa87a901
commit 6ede310cd0

View File

@ -0,0 +1,141 @@
//
// BarIndicatorView.swift
// MVMCoreUI
//
// Created by Kevin Christiano on 2/3/20.
// Copyright © 2020 Verizon Wireless. All rights reserved.
//
import UIKit
open class BarsIndicatorView: View, IndicatorViewProtocol {
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
let stackView: StackView = {
let stackView = StackView()
stackView.axis = .horizontal
stackView.distribution = .equalSpacing
stackView.spacing = 6
return stackView
}()
public var barsReference: [(view: View, constraint: NSLayoutConstraint)] = []
// Dimensions are based on InVision Design Guidelines.
public static let indicatorBarWidth: CGFloat = 24
public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1)
public var enabledColor: UIColor {
return (superview as? CarouselIndicator)?.indicatorTintColor ?? .black
}
public var currentIndexColor: UIColor {
return (superview as? CarouselIndicator)?.currentIndicatorColor ?? .black
}
public var disabledColor: UIColor {
return (superview as? CarouselIndicator)?.disabledIndicatorColor ?? .mvmCoolGray3
}
/// Returns the numberOfPages count from its parent CarouselIndicator.
public var numberOfPages: Int? {
return (superview as? CarouselIndicator)?.numberOfPages
}
/// Returns the numberOfPages count from its parent CarouselIndicator.
public var currentIndex: Int? {
return (superview as? CarouselIndicator)?.currentIndex
}
open var isEnabled: Bool = true {
didSet {
barsReference.forEach { view, heightConstraint in
view.backgroundColor = isEnabled ? enabledColor : disabledColor
}
}
}
//--------------------------------------------------
// MARK: - Initializers
//--------------------------------------------------
public init() {
super.init(frame: .zero)
}
public required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//--------------------------------------------------
// MARK: - Setup
//--------------------------------------------------
open override func setupView() {
super.setupView()
guard subviews.isEmpty else { return }
addSubview(stackView)
isUserInteractionEnabled = false
stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true
trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true
generateBars()
}
//--------------------------------------------------
// MARK: - Methods
//--------------------------------------------------
func generateBars() {
guard let numberOfPages = numberOfPages,
let currentIndex = currentIndex
else { return }
var bars = [(View, NSLayoutConstraint)]()
for i in 0..<numberOfPages {
let bar = View()
bar.widthAnchor.constraint(equalToConstant: BarsIndicatorView.indicatorBarWidth).isActive = true
bar.backgroundColor = enabledColor
let barHeight = i == currentIndex ? BarsIndicatorView.indicatorBarHeight.selected : BarsIndicatorView.indicatorBarHeight.unselected
let heightConstraint = bar.heightAnchor.constraint(equalToConstant: barHeight)
heightConstraint.isActive = true
stackView.addArrangedSubview(bar)
bars.append((bar, heightConstraint))
}
barsReference = bars
}
//--------------------------------------------------
// MARK: - IndicatorViewProtocol
//--------------------------------------------------
public override func reset() {
super.reset()
barsReference.forEach { $0.view.removeFromSuperview() }
barsReference = []
}
public func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) {
let expression = {
self.barsReference[previousIndex].view.backgroundColor = self.enabledColor
self.barsReference[newIndex].view.backgroundColor = self.currentIndexColor
self.barsReference[previousIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected
self.barsReference[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected
self.layoutIfNeeded()
}
isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression()
}
}