2022-10-04 00:02:41 -04:00
|
|
|
//
|
|
|
|
// StatusContentContainer.swift
|
|
|
|
// Tusker
|
|
|
|
//
|
|
|
|
// Created by Shadowfacts on 10/2/22.
|
|
|
|
// Copyright © 2022 Shadowfacts. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
|
|
|
|
class StatusContentContainer: UIView {
|
|
|
|
|
|
|
|
let contentTextView = StatusContentTextView().configure {
|
2022-10-05 17:40:00 -04:00
|
|
|
$0.defaultFont = .systemFont(ofSize: 16)
|
|
|
|
$0.isScrollEnabled = false
|
|
|
|
$0.backgroundColor = nil
|
|
|
|
$0.isEditable = false
|
|
|
|
$0.isSelectable = false
|
2022-10-04 00:02:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
let cardView = StatusCardView().configure {
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
|
$0.heightAnchor.constraint(equalToConstant: 65),
|
|
|
|
])
|
|
|
|
}
|
|
|
|
|
|
|
|
let attachmentsView = AttachmentsContainerView().configure {
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
|
$0.heightAnchor.constraint(equalTo: $0.widthAnchor, multiplier: 9/16),
|
|
|
|
])
|
|
|
|
}
|
|
|
|
|
|
|
|
let pollView = StatusPollView()
|
|
|
|
|
2022-10-04 22:48:42 -04:00
|
|
|
private var arrangedSubviews: [UIView] {
|
|
|
|
[contentTextView, cardView, attachmentsView, pollView]
|
|
|
|
}
|
|
|
|
|
|
|
|
private var isHiddenObservations: [NSKeyValueObservation] = []
|
|
|
|
|
|
|
|
private var verticalConstraints: [NSLayoutConstraint] = []
|
|
|
|
private var lastSubviewBottomConstraint: NSLayoutConstraint?
|
2022-10-04 00:02:41 -04:00
|
|
|
private var zeroHeightConstraint: NSLayoutConstraint!
|
|
|
|
|
|
|
|
override init(frame: CGRect) {
|
|
|
|
super.init(frame: frame)
|
|
|
|
|
2022-10-04 22:48:42 -04:00
|
|
|
for subview in arrangedSubviews {
|
2022-10-04 00:02:41 -04:00
|
|
|
subview.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
addSubview(subview)
|
|
|
|
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
|
subview.leadingAnchor.constraint(equalTo: leadingAnchor),
|
|
|
|
subview.trailingAnchor.constraint(equalTo: trailingAnchor),
|
|
|
|
])
|
|
|
|
}
|
|
|
|
|
2022-10-04 22:48:42 -04:00
|
|
|
// this constraint needs to have low priority so that during the collapse/expand animation, the content container is the view that shrinks/expands
|
2022-10-04 00:02:41 -04:00
|
|
|
zeroHeightConstraint = heightAnchor.constraint(equalToConstant: 0)
|
|
|
|
zeroHeightConstraint.priority = .defaultLow
|
|
|
|
|
2022-10-04 22:48:42 -04:00
|
|
|
setNeedsUpdateConstraints()
|
|
|
|
|
2022-10-04 00:02:41 -04:00
|
|
|
// mask to bounds so that the during the expand/collapse animation, subviews are clipped
|
|
|
|
layer.masksToBounds = true
|
2022-10-04 22:48:42 -04:00
|
|
|
|
|
|
|
isHiddenObservations = arrangedSubviews.map {
|
|
|
|
$0.observe(\.isHidden) { [unowned self] _, _ in
|
|
|
|
self.setNeedsUpdateConstraints()
|
|
|
|
}
|
|
|
|
}
|
2022-10-04 00:02:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
required init?(coder: NSCoder) {
|
|
|
|
fatalError("init(coder:) has not been implemented")
|
|
|
|
}
|
|
|
|
|
2022-10-04 22:48:42 -04:00
|
|
|
override func updateConstraints() {
|
|
|
|
NSLayoutConstraint.deactivate(verticalConstraints)
|
|
|
|
verticalConstraints = []
|
|
|
|
var lastVisibleSubview: UIView?
|
|
|
|
|
|
|
|
for subview in arrangedSubviews {
|
|
|
|
guard !subview.isHidden else {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if let lastVisibleSubview {
|
|
|
|
verticalConstraints.append(subview.topAnchor.constraint(equalTo: lastVisibleSubview.bottomAnchor, constant: 4))
|
|
|
|
} else {
|
|
|
|
verticalConstraints.append(subview.topAnchor.constraint(equalTo: topAnchor))
|
|
|
|
}
|
|
|
|
|
|
|
|
lastVisibleSubview = subview
|
|
|
|
}
|
|
|
|
|
|
|
|
NSLayoutConstraint.activate(verticalConstraints)
|
|
|
|
|
|
|
|
lastSubviewBottomConstraint?.isActive = false
|
|
|
|
// this constraint needs to have low priority so that during the collapse/expand animation, the content container is the view that shrinks/expands
|
|
|
|
lastSubviewBottomConstraint = subviews.last(where: { !$0.isHidden })!.bottomAnchor.constraint(equalTo: bottomAnchor)
|
|
|
|
lastSubviewBottomConstraint!.isActive = true
|
|
|
|
lastSubviewBottomConstraint!.priority = .defaultLow
|
|
|
|
|
|
|
|
super.updateConstraints()
|
|
|
|
}
|
|
|
|
|
2022-10-04 00:02:41 -04:00
|
|
|
func setCollapsed(_ collapsed: Bool) {
|
2022-10-04 22:48:42 -04:00
|
|
|
// ensure that we have a lastSubviewBottomConstraint
|
|
|
|
updateConstraintsIfNeeded()
|
|
|
|
// force unwrap because the content container should always have at least one view
|
|
|
|
lastSubviewBottomConstraint!.isActive = !collapsed
|
2022-10-04 00:02:41 -04:00
|
|
|
zeroHeightConstraint.isActive = collapsed
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|