101 lines
3.5 KiB
Swift
101 lines
3.5 KiB
Swift
// Copyright © 2020 Metabolist. All rights reserved.
|
|
|
|
import Mastodon
|
|
import UIKit
|
|
import ViewModels
|
|
|
|
final class PollResultView: UIView {
|
|
let titleLabel = AnimatedAttachmentLabel()
|
|
let percentLabel = UILabel()
|
|
private let verticalStackView = UIStackView()
|
|
private let horizontalStackView = UIStackView()
|
|
private let percentView = UIProgressView()
|
|
|
|
init(option: Poll.Option,
|
|
emojis: [Emoji],
|
|
selected: Bool,
|
|
multipleSelection: Bool,
|
|
votersCount: Int,
|
|
identityContext: IdentityContext) {
|
|
super.init(frame: .zero)
|
|
|
|
addSubview(verticalStackView)
|
|
verticalStackView.translatesAutoresizingMaskIntoConstraints = false
|
|
verticalStackView.axis = .vertical
|
|
verticalStackView.spacing = .compactSpacing
|
|
|
|
verticalStackView.addArrangedSubview(horizontalStackView)
|
|
horizontalStackView.spacing = .compactSpacing
|
|
|
|
verticalStackView.addArrangedSubview(percentView)
|
|
|
|
if selected {
|
|
let imageView = UIImageView(
|
|
image: UIImage(
|
|
systemName: multipleSelection ? "checkmark.square" : "checkmark.circle",
|
|
withConfiguration: UIImage.SymbolConfiguration(scale: .medium)))
|
|
|
|
imageView.contentMode = .scaleAspectFit
|
|
imageView.setContentHuggingPriority(.required, for: .horizontal)
|
|
horizontalStackView.addArrangedSubview(imageView)
|
|
}
|
|
|
|
horizontalStackView.addArrangedSubview(titleLabel)
|
|
titleLabel.font = .preferredFont(forTextStyle: .callout)
|
|
titleLabel.adjustsFontForContentSizeCategory = true
|
|
titleLabel.numberOfLines = 0
|
|
|
|
horizontalStackView.addArrangedSubview(percentLabel)
|
|
percentLabel.font = .preferredFont(forTextStyle: .callout)
|
|
percentLabel.adjustsFontForContentSizeCategory = true
|
|
percentLabel.setContentHuggingPriority(.required, for: .horizontal)
|
|
|
|
let attributedTitle = NSMutableAttributedString(string: option.title)
|
|
|
|
attributedTitle.insert(emojis: emojis, view: titleLabel, identityContext: identityContext)
|
|
attributedTitle.resizeAttachments(toLineHeight: titleLabel.font.lineHeight)
|
|
titleLabel.attributedText = attributedTitle
|
|
|
|
let percent: Float
|
|
|
|
if votersCount == 0 {
|
|
percent = 0
|
|
} else {
|
|
percent = Float(option.votesCount) / Float(votersCount)
|
|
}
|
|
|
|
percentLabel.text = Self.percentFormatter.string(from: NSNumber(value: percent))
|
|
percentView.progress = percent
|
|
|
|
NSLayoutConstraint.activate([
|
|
verticalStackView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
|
verticalStackView.topAnchor.constraint(equalTo: topAnchor),
|
|
verticalStackView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
|
verticalStackView.bottomAnchor.constraint(equalTo: bottomAnchor)
|
|
])
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
}
|
|
|
|
extension PollResultView {
|
|
static func estimatedHeight(width: CGFloat, title: String) -> CGFloat {
|
|
title.height(width: width, font: .preferredFont(forTextStyle: .callout))
|
|
+ .compactSpacing
|
|
+ 4 // progress view height
|
|
}
|
|
}
|
|
|
|
private extension PollResultView {
|
|
private static var percentFormatter: NumberFormatter = {
|
|
let percentageFormatter = NumberFormatter()
|
|
|
|
percentageFormatter.numberStyle = .percent
|
|
|
|
return percentageFormatter
|
|
}()
|
|
}
|