// // SettingSliderTableViewCell.swift // Earthquake Network // // Created by Busi Andrea on 25/08/2020. // Copyright © 2020 Earthquake Network. All rights reserved. // import UIKit class SettingSliderTableViewCell: UITableViewCell { @objc static let Identifier = "SliderCell" @objc var isDisabled: Bool = false { didSet { updateUI() } } @objc var valueChanged: ((EQNGenericValue) -> Void)? @objc var dragEnded: (() -> Void)? private var items = [EQNGenericValue]() // MARK: - Properties @objc lazy var titleLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.numberOfLines = 0 label.font = UIFont.preferredFont(forTextStyle: .body) label.textColor = AppTheme.shared.textColor return label }() @objc lazy var valueLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.numberOfLines = 0 label.font = UIFont.preferredFont(forTextStyle: .subheadline) label.textColor = AppTheme.shared.valueColor return label }() @objc lazy var slider: UISlider = { let slider = UISlider() slider.isContinuous = true slider.addTarget(self, action: #selector(sliderChanged(_:)), for: .valueChanged) slider.addTarget(self, action: #selector(sliderEnded(_:)), for: .touchUpInside) return slider }() // MARK: - Init override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setupUI() } required init?(coder: NSCoder) { super.init(coder: coder) setupUI() } // MARK: - Private private func setupUI() { selectionStyle = .none let stackView = UIStackView() stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .vertical stackView.distribution = .equalSpacing stackView.spacing = 8 stackView.addArrangedSubview(titleLabel) stackView.addArrangedSubview(valueLabel) stackView.addArrangedSubview(slider) contentView.addSubview(stackView) stackView.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor).isActive = true stackView.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor).isActive = true stackView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor).isActive = true stackView.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor).isActive = true } private func updateUI() { let theme = AppTheme.shared titleLabel.textColor = isDisabled ? theme.textDisabledColor : theme.textColor valueLabel.textColor = isDisabled ? theme.textDisabledColor : theme.valueColor slider.isEnabled = !isDisabled } // MARK: - Actions @objc private func sliderChanged(_ sender: UISlider) { let index = Int(sender.value) let item = items[index] // make slider with step values let step: Float = 1 let roundedValue = round(sender.value / step) * step sender.value = roundedValue // update value valueLabel.text = item.display valueChanged?(item) } @objc private func sliderEnded(_ sender: UISlider) { dragEnded?() } // MARK: - Public @objc func configureSlider(with items: [EQNGenericValue], current: EQNGenericValue) { self.items = items slider.minimumValue = 0 slider.maximumValue = Float(items.count - 1) if let index = items.firstIndex(of: current) { slider.value = Float(index) valueLabel.text = current.display } else { slider.value = 0 valueLabel.text = "" } } }