89 lines
2.6 KiB
Swift
89 lines
2.6 KiB
Swift
//
|
|
// MetaTextViewRepresentable.swift
|
|
//
|
|
//
|
|
// Created by MainasuK Cirno on 2021-7-16.
|
|
//
|
|
|
|
import UIKit
|
|
import SwiftUI
|
|
import UITextView_Placeholder
|
|
import MetaTextKit
|
|
import MastodonAsset
|
|
import MastodonCore
|
|
|
|
public struct MetaTextViewRepresentable: UIViewRepresentable {
|
|
|
|
let metaText = MetaText()
|
|
|
|
// input
|
|
@Binding var string: String
|
|
let width: CGFloat
|
|
|
|
// handler
|
|
let configurationHandler: (MetaText) -> Void
|
|
|
|
public func makeUIView(context: Context) -> MetaTextView {
|
|
let textView = metaText.textView
|
|
|
|
textView.backgroundColor = .clear // clear background
|
|
textView.textContainer.lineFragmentPadding = 0 // remove leading inset
|
|
textView.isScrollEnabled = false // enable dynamic height
|
|
|
|
// set width constraint
|
|
textView.translatesAutoresizingMaskIntoConstraints = false
|
|
NSLayoutConstraint.activate([
|
|
textView.widthAnchor.constraint(equalToConstant: width).priority(.required - 1)
|
|
])
|
|
// make textView horizontal filled
|
|
textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
|
|
|
|
// setup editor appearance
|
|
let font = UIFont.preferredFont(forTextStyle: .body)
|
|
metaText.textView.font = font
|
|
metaText.textAttributes = [
|
|
.font: font,
|
|
.foregroundColor: UIColor.label,
|
|
]
|
|
metaText.linkAttributes = [
|
|
.font: font,
|
|
.foregroundColor: Asset.Colors.Brand.blurple.color,
|
|
]
|
|
|
|
metaText.paragraphStyle = NSMutableParagraphStyle()
|
|
|
|
configurationHandler(metaText)
|
|
|
|
metaText.configure(content: PlaintextMetaContent(string: string))
|
|
|
|
return textView
|
|
}
|
|
|
|
public func updateUIView(_ metaTextView: MetaTextView, context: Context) {
|
|
// update layout
|
|
context.coordinator.widthLayoutConstraint.constant = width
|
|
|
|
// trigger layout engine update to adjust to text height
|
|
metaText.textView.setNeedsLayout()
|
|
metaText.textView.layoutIfNeeded()
|
|
}
|
|
|
|
public func makeCoordinator() -> Coordinator {
|
|
Coordinator(self)
|
|
}
|
|
|
|
public class Coordinator: NSObject, UITextViewDelegate {
|
|
let view: MetaTextViewRepresentable
|
|
var widthLayoutConstraint: NSLayoutConstraint!
|
|
|
|
init(_ view: MetaTextViewRepresentable) {
|
|
self.view = view
|
|
super.init()
|
|
|
|
widthLayoutConstraint = view.metaText.textView.widthAnchor.constraint(equalToConstant: 100)
|
|
widthLayoutConstraint.isActive = true
|
|
}
|
|
}
|
|
|
|
}
|