// // TimelineHeaderView.swift // Mastodon // // Created by MainasuK Cirno on 2021-4-6. // import UIKit final class TimelineHeaderView: UIView { let iconImageView: UIImageView = { let imageView = UIImageView() imageView.tintColor = Asset.Colors.Label.secondary.color return imageView }() let messageLabel: UILabel = { let label = UILabel() label.font = .systemFont(ofSize: 17) label.textAlignment = .center label.textColor = Asset.Colors.Label.secondary.color label.text = "info" label.numberOfLines = 0 return label }() override init(frame: CGRect) { super.init(frame: frame) _init() } required init?(coder: NSCoder) { super.init(coder: coder) _init() } } extension TimelineHeaderView { private func _init() { backgroundColor = .clear let topPaddingView = UIView() topPaddingView.translatesAutoresizingMaskIntoConstraints = false addSubview(topPaddingView) NSLayoutConstraint.activate([ topPaddingView.topAnchor.constraint(equalTo: topAnchor), topPaddingView.leadingAnchor.constraint(equalTo: leadingAnchor), topPaddingView.trailingAnchor.constraint(equalTo: trailingAnchor), ]) let containerStackView = UIStackView() containerStackView.axis = .vertical containerStackView.alignment = .center containerStackView.distribution = .fill containerStackView.spacing = 16 containerStackView.translatesAutoresizingMaskIntoConstraints = false addSubview(containerStackView) NSLayoutConstraint.activate([ containerStackView.topAnchor.constraint(equalTo: topPaddingView.bottomAnchor), containerStackView.leadingAnchor.constraint(equalTo: leadingAnchor), containerStackView.trailingAnchor.constraint(equalTo: trailingAnchor), ]) containerStackView.addArrangedSubview(iconImageView) containerStackView.addArrangedSubview(messageLabel) let bottomPaddingView = UIView() bottomPaddingView.translatesAutoresizingMaskIntoConstraints = false addSubview(bottomPaddingView) NSLayoutConstraint.activate([ bottomPaddingView.topAnchor.constraint(equalTo: containerStackView.bottomAnchor), bottomPaddingView.leadingAnchor.constraint(equalTo: leadingAnchor), bottomPaddingView.trailingAnchor.constraint(equalTo: trailingAnchor), bottomPaddingView.bottomAnchor.constraint(equalTo: bottomAnchor), ]) NSLayoutConstraint.activate([ topPaddingView.heightAnchor.constraint(equalToConstant: 100).priority(.defaultHigh), bottomPaddingView.heightAnchor.constraint(equalTo: topPaddingView.heightAnchor, multiplier: 1.0), ]) } } extension Item.EmptyStateHeaderAttribute.Reason { var iconImage: UIImage? { switch self { case .noStatusFound, .blocking, .blocked: return UIImage(systemName: "nosign", withConfiguration: UIImage.SymbolConfiguration(pointSize: 64, weight: .bold))! case .suspended: return UIImage(systemName: "person.crop.circle.badge.xmark", withConfiguration: UIImage.SymbolConfiguration(pointSize: 64, weight: .bold))! } } var message: String { switch self { case .noStatusFound: return L10n.Common.Controls.Timeline.Header.noStatusFound case .blocking: return L10n.Common.Controls.Timeline.Header.blockingWarning case .blocked: return L10n.Common.Controls.Timeline.Header.blockedWarning case .suspended(let name): if let name = name { return L10n.Common.Controls.Timeline.Header.userSuspendedWarning(name) } else { return L10n.Common.Controls.Timeline.Header.suspendedWarning } } } } #if DEBUG && canImport(SwiftUI) import SwiftUI struct TimelineHeaderView_Previews: PreviewProvider { static var previews: some View { Group { UIViewPreview(width: 375) { let headerView = TimelineHeaderView() headerView.iconImageView.image = Item.EmptyStateHeaderAttribute.Reason.blocking.iconImage headerView.messageLabel.text = Item.EmptyStateHeaderAttribute.Reason.blocking.message return headerView } .previewLayout(.fixed(width: 375, height: 400)) } } } #endif