Skip to content
Snippets Groups Projects
SegmentedControl.swift 2.42 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
import UIKit
import Shared
import SnapKit

final class SegmentedControl: UIView {
Ahmed Shehata's avatar
Ahmed Shehata committed
    private let trackHeight = 2.0
    private let numberOfTabs = 2.0
    private let trackView = UIView()
    private let stackView = UIStackView()
    private var leftConstraint: Constraint?
    private let trackIndicatorView = UIView()
    private(set) var leftButton = SegmentedControlButton()
    private(set) var rightButton = SegmentedControlButton()
Bruno Muniz's avatar
Bruno Muniz committed

    init() {
        super.init(frame: .zero)

Ahmed Shehata's avatar
Ahmed Shehata committed
        rightButton.setup(
            title: Localized.Scan.SegmentedControl.right,
            icon: Asset.scanQr.image
        )
Bruno Muniz's avatar
Bruno Muniz committed

Ahmed Shehata's avatar
Ahmed Shehata committed
        leftButton.setup(
            title: Localized.Scan.SegmentedControl.left,
            icon: Asset.scanScan.image
        )
Bruno Muniz's avatar
Bruno Muniz committed

Ahmed Shehata's avatar
Ahmed Shehata committed
        trackView.backgroundColor = Asset.neutralLine.color
Bruno Muniz's avatar
Bruno Muniz committed
        trackIndicatorView.backgroundColor = Asset.brandPrimary.color

Ahmed Shehata's avatar
Ahmed Shehata committed
        stackView.distribution = .fillEqually
Bruno Muniz's avatar
Bruno Muniz committed
        stackView.addArrangedSubview(leftButton)
        stackView.addArrangedSubview(rightButton)

        addSubview(stackView)
        addSubview(trackView)
        trackView.addSubview(trackIndicatorView)

Ahmed Shehata's avatar
Ahmed Shehata committed
        stackView.snp.makeConstraints {
            $0.top.equalToSuperview()
            $0.left.equalToSuperview()
            $0.right.equalToSuperview()
            $0.bottom.equalTo(trackView.snp.top)
Bruno Muniz's avatar
Bruno Muniz committed
        }

Ahmed Shehata's avatar
Ahmed Shehata committed
        trackView.snp.makeConstraints {
            $0.height.equalTo(trackHeight)
            $0.left.equalToSuperview()
            $0.right.equalToSuperview()
            $0.bottom.equalToSuperview()
Bruno Muniz's avatar
Bruno Muniz committed
        }

Ahmed Shehata's avatar
Ahmed Shehata committed
        trackIndicatorView.snp.makeConstraints {
            $0.top.equalToSuperview()
            leftConstraint = $0.left.equalToSuperview().constraint
            $0.width.equalToSuperview().dividedBy(numberOfTabs)
            $0.bottom.equalToSuperview()
Bruno Muniz's avatar
Bruno Muniz committed
        }
    }

    required init?(coder: NSCoder) { nil }

Ahmed Shehata's avatar
Ahmed Shehata committed
    func updateLeftConstraint(_ percentageScrolled: CGFloat) {
        let tabWidth = bounds.width / numberOfTabs
        let leftOffset = percentageScrolled * tabWidth
        leftConstraint?.update(offset: leftOffset)

        leftButton.update(color: .fade(
            from: Asset.brandPrimary.color,
            to: Asset.neutralLine.color,
            pcent: percentageScrolled
        ))

        rightButton.update(color: .fade(
            from: Asset.brandPrimary.color,
            to: Asset.neutralLine.color,
            pcent: 1 - percentageScrolled
        ))
Bruno Muniz's avatar
Bruno Muniz committed
    }
}