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

94 lines
3.4 KiB
Swift

// Copyright © 2020 Metabolist. All rights reserved.
import Mastodon
import UIKit
import ViewModels
final class PollOptionButton: UIView {
let button = UIButton()
public var isSelected = false {
didSet {
imageView.image = isSelected ? selectedImage : image
button.isSelected = isSelected
}
}
private let label = AnimatedAttachmentLabel()
private let imageView = UIImageView()
private let image: UIImage?
private let selectedImage: UIImage?
// swiftlint:disable:next function_body_length
init(title: String, emojis: [Emoji], multipleSelection: Bool, identityContext: IdentityContext) {
image = UIImage(
systemName: multipleSelection ? "square" : "circle",
withConfiguration: UIImage.SymbolConfiguration(scale: .medium))
selectedImage = UIImage(
systemName: multipleSelection ? "checkmark.square" : "checkmark.circle",
withConfiguration: UIImage.SymbolConfiguration(scale: .medium))
super.init(frame: .zero)
let stackView = UIStackView()
addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.spacing = .defaultSpacing
stackView.addArrangedSubview(imageView)
imageView.contentMode = .scaleAspectFit
imageView.setContentHuggingPriority(.required, for: .horizontal)
stackView.addArrangedSubview(label)
label.font = .preferredFont(forTextStyle: .callout)
label.adjustsFontForContentSizeCategory = true
label.numberOfLines = 0
let attributedTitle = NSMutableAttributedString(string: title)
attributedTitle.insert(emojis: emojis, view: label, identityContext: identityContext)
attributedTitle.resizeAttachments(toLineHeight: label.font.lineHeight)
label.attributedText = attributedTitle
addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
button.accessibilityAttributedLabel = attributedTitle
let touchStartAction = UIAction { [weak self] _ in self?.alpha = 0.75 }
button.addAction(touchStartAction, for: .touchDown)
button.addAction(touchStartAction, for: .touchDragEnter)
let touchEndAction = UIAction { [weak self] _ in self?.alpha = 1 }
button.addAction(touchEndAction, for: .touchDragExit)
button.addAction(touchEndAction, for: .touchUpInside)
button.addAction(touchEndAction, for: .touchUpOutside)
button.addAction(touchEndAction, for: .touchCancel)
NSLayoutConstraint.activate([
stackView.leadingAnchor.constraint(equalTo: leadingAnchor),
stackView.topAnchor.constraint(equalTo: topAnchor),
stackView.trailingAnchor.constraint(equalTo: trailingAnchor),
stackView.bottomAnchor.constraint(equalTo: bottomAnchor),
button.leadingAnchor.constraint(equalTo: leadingAnchor),
button.topAnchor.constraint(equalTo: topAnchor),
button.trailingAnchor.constraint(equalTo: trailingAnchor),
button.bottomAnchor.constraint(equalTo: bottomAnchor)
])
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension PollOptionButton {
static func estimatedHeight(width: CGFloat, title: String) -> CGFloat {
title.height(width: width, font: .preferredFont(forTextStyle: .callout))
}
}