forked from shadowfacts/Tusker
Shadowfacts
203c1852d4
Fixes flicker/animation due to new option views begin added in default state and then changed back to the state of the existing view. Fixes #403
87 lines
2.3 KiB
Swift
87 lines
2.3 KiB
Swift
//
|
|
// PollOptionCheckboxView.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 4/25/21.
|
|
// Copyright © 2021 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class PollOptionCheckboxView: UIView {
|
|
|
|
private static let size: CGFloat = 20
|
|
|
|
var isChecked: Bool = false {
|
|
didSet {
|
|
updateStyle()
|
|
}
|
|
}
|
|
var readOnly: Bool = true {
|
|
didSet {
|
|
updateStyle()
|
|
}
|
|
}
|
|
var voted: Bool = false {
|
|
didSet {
|
|
updateStyle()
|
|
}
|
|
}
|
|
var multiple: Bool = false {
|
|
didSet {
|
|
updateStyle()
|
|
}
|
|
}
|
|
|
|
private let imageView: UIImageView
|
|
|
|
init() {
|
|
imageView = UIImageView(image: UIImage(systemName: "checkmark")!)
|
|
|
|
super.init(frame: .zero)
|
|
|
|
layer.cornerCurve = .continuous
|
|
layer.borderWidth = 2
|
|
|
|
imageView.translatesAutoresizingMaskIntoConstraints = false
|
|
imageView.isHidden = true
|
|
addSubview(imageView)
|
|
|
|
updateStyle()
|
|
|
|
NSLayoutConstraint.activate([
|
|
widthAnchor.constraint(equalTo: heightAnchor),
|
|
widthAnchor.constraint(equalToConstant: PollOptionCheckboxView.size),
|
|
|
|
imageView.widthAnchor.constraint(equalTo: widthAnchor, constant: -3),
|
|
imageView.heightAnchor.constraint(equalTo: heightAnchor, constant: -3),
|
|
imageView.centerXAnchor.constraint(equalTo: centerXAnchor),
|
|
imageView.centerYAnchor.constraint(equalTo: centerYAnchor),
|
|
])
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
override var intrinsicContentSize: CGSize {
|
|
CGSize(width: 20, height: 20)
|
|
}
|
|
|
|
private func updateStyle() {
|
|
layer.cornerRadius = (multiple ? 0.1 : 0.5) * PollOptionCheckboxView.size
|
|
|
|
imageView.isHidden = !isChecked
|
|
if voted || readOnly {
|
|
layer.borderColor = UIColor.clear.cgColor
|
|
} else if isChecked {
|
|
layer.borderColor = tintColor.cgColor
|
|
} else {
|
|
layer.borderColor = UIColor.gray.cgColor
|
|
}
|
|
backgroundColor = isChecked && !voted ? tintColor : .clear
|
|
imageView.tintColor = voted ? .label : .white
|
|
}
|
|
|
|
}
|