Files
bundesmessenger-ios/bwi/MarkDown/MarkDownView.swift
T
2023-06-29 12:18:10 +02:00

63 lines
2.2 KiB
Swift

//
/*
* Copyright (c) 2023 BWI GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import SwiftUI
import Down
struct MarkDownView: View {
var markdownString: String
@State var labelHeight: CGFloat = .zero
var body: some View {
GeometryReader { geometry in
ScrollView(.vertical) {
UIMarkDownWrapper(markDownString: markdownString, height: $labelHeight)
.frame(width: geometry.size.width - 20)
.frame(minHeight: labelHeight)
.padding(10)
}
.background(Color(ThemeService.shared().theme.backgroundColor))
}
}
}
struct UIMarkDownWrapper: UIViewRepresentable {
var markDownString: String
@Binding var height: CGFloat
func makeUIView(context: Context) -> UILabel {
let label = UILabel(frame: .zero)
label.numberOfLines = 0
label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
return label
}
func updateUIView(_ uiView: UILabel, context: Context) {
let down = Down(markdownString: markDownString)
guard let attributedString = try? down.toAttributedString(stylesheet: "* {font-family: sans-serif; font-size: 16pt; } ") else { return }
let mutableString = NSMutableAttributedString(attributedString: attributedString)
mutableString.addAttributes([.foregroundColor: ThemeService.shared().theme.textPrimaryColor], range: NSRange(location: 0, length: attributedString.length))
uiView.attributedText = mutableString
DispatchQueue.main.async {
height = uiView.sizeThatFits(CGSize(width: uiView.bounds.width, height: CGFloat.greatestFiniteMagnitude)).height
}
}
}