parent
80c145111a
commit
f26f36a60b
|
@ -8,18 +8,33 @@
|
|||
import SwiftUI
|
||||
|
||||
class AltViewController: UIViewController {
|
||||
private var alt: String
|
||||
let label = {
|
||||
let textView = {
|
||||
let textView: UITextView
|
||||
|
||||
if #available(iOS 16, *) {
|
||||
// TODO: update code below to use TextKit 2 when dropping iOS 15 support
|
||||
return UITextView(usingTextLayoutManager: false)
|
||||
textView = UITextView(usingTextLayoutManager: false)
|
||||
} else {
|
||||
return UITextView()
|
||||
textView = UITextView()
|
||||
}
|
||||
|
||||
textView.textContainer.maximumNumberOfLines = 0
|
||||
textView.textContainer.lineBreakMode = .byWordWrapping
|
||||
textView.font = .preferredFont(forTextStyle: .callout)
|
||||
textView.isScrollEnabled = true
|
||||
textView.backgroundColor = .clear
|
||||
textView.isOpaque = false
|
||||
textView.isEditable = false
|
||||
textView.tintColor = .white
|
||||
textView.textContainerInset = UIEdgeInsets(top: 12, left: 8, bottom: 8, right: 8)
|
||||
textView.contentInsetAdjustmentBehavior = .always
|
||||
textView.verticalScrollIndicatorInsets.bottom = 4
|
||||
|
||||
return textView
|
||||
}()
|
||||
|
||||
init(alt: String, sourceView: UIView?) {
|
||||
self.alt = alt
|
||||
textView.text = alt
|
||||
super.init(nibName: nil, bundle: nil)
|
||||
self.modalPresentationStyle = .popover
|
||||
self.popoverPresentationController?.delegate = self
|
||||
|
@ -40,49 +55,32 @@ class AltViewController: UIViewController {
|
|||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
label.translatesAutoresizingMaskIntoConstraints = false
|
||||
label.textContainer.maximumNumberOfLines = 0
|
||||
label.textContainer.lineBreakMode = .byWordWrapping
|
||||
label.textContainerInset = UIEdgeInsets(
|
||||
top: 8,
|
||||
left: 0,
|
||||
bottom: -label.textContainer.lineFragmentPadding,
|
||||
right: 0
|
||||
)
|
||||
label.font = .preferredFont(forTextStyle: .callout)
|
||||
label.isScrollEnabled = true
|
||||
label.backgroundColor = .clear
|
||||
label.isOpaque = false
|
||||
label.isEditable = false
|
||||
label.tintColor = .white
|
||||
label.text = alt
|
||||
label.textContainerInset = UIEdgeInsets(top: 12, left: 8, bottom: 8, right: 8)
|
||||
label.contentInsetAdjustmentBehavior = .always
|
||||
label.verticalScrollIndicatorInsets.bottom = 4
|
||||
|
||||
textView.translatesAutoresizingMaskIntoConstraints = false
|
||||
view.backgroundColor = .systemBackground
|
||||
view.addSubview(label)
|
||||
view.addSubview(textView)
|
||||
|
||||
label.pinToParent()
|
||||
textView.pinToParent()
|
||||
NSLayoutConstraint.activate([
|
||||
label.widthAnchor.constraint(lessThanOrEqualToConstant: 400),
|
||||
textView.widthAnchor.constraint(lessThanOrEqualToConstant: 400),
|
||||
])
|
||||
}
|
||||
|
||||
override func viewDidLayoutSubviews() {
|
||||
super.viewDidLayoutSubviews()
|
||||
UIView.performWithoutAnimation {
|
||||
let size = label.layoutManager.boundingRect(forGlyphRange: NSMakeRange(0, (label.textStorage.string as NSString).length), in: label.textContainer).size
|
||||
|
||||
let size = textView.layoutManager.boundingRect(forGlyphRange: NSMakeRange(0, (textView.textStorage.string as NSString).length), in: textView.textContainer).size
|
||||
|
||||
preferredContentSize = CGSize(
|
||||
width: size.width + (8 + label.textContainer.lineFragmentPadding) * 2,
|
||||
height: size.height + 12 + (label.textContainer.lineFragmentPadding * 2)
|
||||
width: size.width + (8 + textView.textContainer.lineFragmentPadding) * 2,
|
||||
height: size.height + 12 + (textView.textContainer.lineFragmentPadding) * 2
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
||||
super.traitCollectionDidChange(previousTraitCollection)
|
||||
label.font = .preferredFont(forTextStyle: .callout)
|
||||
textView.font = .preferredFont(forTextStyle: .callout)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -181,9 +181,9 @@ extension MediaPreviewViewController {
|
|||
|
||||
@objc private func altButtonPressed(_ sender: UIButton) {
|
||||
guard let alt = viewModel.altText else { return }
|
||||
|
||||
present(AltViewController(alt: alt, sourceView: sender), animated: true)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - MediaPreviewingViewController
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
import SwiftUI
|
||||
|
||||
@available(iOS 15.0, *)
|
||||
struct MediaAltTextOverlay: View {
|
||||
var altDescription: String?
|
||||
|
||||
|
@ -69,7 +68,6 @@ struct MediaAltTextOverlay: View {
|
|||
}
|
||||
}
|
||||
|
||||
@available(iOS 15.0, *)
|
||||
struct MediaAltTextOverlay_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
MediaAltTextOverlay(altDescription: "Hello, world!")
|
||||
|
|
|
@ -73,20 +73,12 @@ public final class MediaView: UIView {
|
|||
return label
|
||||
}()
|
||||
|
||||
let _altViewController: UIViewController! = {
|
||||
if #available(iOS 15.0, *) {
|
||||
let vc = UIHostingController(rootView: MediaAltTextOverlay())
|
||||
vc.view.backgroundColor = .clear
|
||||
return vc
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
let altViewController: UIHostingController<MediaAltTextOverlay> = {
|
||||
let vc = UIHostingController(rootView: MediaAltTextOverlay())
|
||||
vc.view.backgroundColor = .clear
|
||||
return vc
|
||||
}()
|
||||
@available(iOS 15.0, *)
|
||||
var altViewController: UIHostingController<MediaAltTextOverlay> {
|
||||
_altViewController as! UIHostingController<MediaAltTextOverlay>
|
||||
}
|
||||
|
||||
|
||||
public override init(frame: CGRect) {
|
||||
super.init(frame: frame)
|
||||
_init()
|
||||
|
@ -228,9 +220,8 @@ extension MediaView {
|
|||
} else {
|
||||
accessibilityLabel = altDescription
|
||||
}
|
||||
if #available(iOS 15.0, *) {
|
||||
altViewController.rootView.altDescription = altDescription
|
||||
}
|
||||
|
||||
altViewController.rootView.altDescription = altDescription
|
||||
}
|
||||
|
||||
private func layoutBlurhash() {
|
||||
|
@ -262,11 +253,9 @@ extension MediaView {
|
|||
}
|
||||
|
||||
private func layoutAlt() {
|
||||
if #available(iOS 15.0, *) {
|
||||
altViewController.view.translatesAutoresizingMaskIntoConstraints = false
|
||||
container.addSubview(altViewController.view)
|
||||
altViewController.view.pinToParent()
|
||||
}
|
||||
altViewController.view.translatesAutoresizingMaskIntoConstraints = false
|
||||
container.addSubview(altViewController.view)
|
||||
altViewController.view.pinToParent()
|
||||
}
|
||||
|
||||
public func prepareForReuse() {
|
||||
|
@ -304,10 +293,8 @@ extension MediaView {
|
|||
container.removeFromSuperview()
|
||||
container.removeConstraints(container.constraints)
|
||||
|
||||
if #available(iOS 15.0, *) {
|
||||
altViewController.rootView.altDescription = nil
|
||||
}
|
||||
|
||||
altViewController.rootView.altDescription = nil
|
||||
|
||||
// reset configuration
|
||||
configuration = nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue