metatext/Views/UIKit/PollResultView.swift
Justin Mazzocchi 8b2acf1ace
Animated emoji
2021-02-21 23:10:34 -08:00

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
}()
}