mirror of
https://github.com/metabolist/metatext
synced 2024-12-29 03:01:07 +01:00
94 lines
3.4 KiB
Swift
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))
|
|
}
|
|
}
|