mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-01 22:35:49 +00:00
81 lines
2.4 KiB
Swift
81 lines
2.4 KiB
Swift
//
|
|
// SwipeLabel.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by Levitating Pineapple on 06/08/2024.
|
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct SwipeLabel: View {
|
|
private let text: String
|
|
private let systemImage: String
|
|
private let inverted: Bool
|
|
|
|
init(_ text: String, systemImage: String, inverted: Bool) {
|
|
self.text = text
|
|
self.systemImage = systemImage
|
|
self.inverted = inverted
|
|
}
|
|
|
|
var body: some View {
|
|
if inverted {
|
|
Image(
|
|
uiImage: SwipeActionView(
|
|
systemName: systemImage,
|
|
text: text
|
|
).snapshot(inverted: inverted)
|
|
)
|
|
} else {
|
|
Label(text, systemImage: systemImage)
|
|
}
|
|
}
|
|
|
|
private class SwipeActionView: UIView {
|
|
private let imageView = UIImageView()
|
|
private let label = UILabel()
|
|
private let fontSize: CGFloat
|
|
|
|
init(systemName: String, text: String) {
|
|
fontSize = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .subheadline).pointSize
|
|
super.init(frame: CGRect(x: 0, y: 0, width: 64, height: 32 + fontSize))
|
|
imageView.image = UIImage(systemName: systemName)
|
|
imageView.contentMode = .scaleAspectFit
|
|
label.text = text
|
|
label.textAlignment = .center
|
|
label.font = UIFont.systemFont(ofSize: fontSize, weight: .medium)
|
|
addSubview(imageView)
|
|
addSubview(label)
|
|
}
|
|
|
|
override func layoutSubviews() {
|
|
imageView.frame = CGRect(
|
|
x: 20,
|
|
y: 0,
|
|
width: 24,
|
|
height: 24
|
|
)
|
|
label.frame = CGRect(
|
|
x: 0,
|
|
y: 32,
|
|
width: 64,
|
|
height: fontSize
|
|
)
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder: NSCoder) { fatalError("not implemented") }
|
|
|
|
func snapshot(inverted: Bool) -> UIImage {
|
|
UIGraphicsImageRenderer(bounds: bounds).image { context in
|
|
if inverted {
|
|
context.cgContext.scaleBy(x: 1, y: -1)
|
|
context.cgContext.translateBy(x: 0, y: -bounds.height)
|
|
}
|
|
layer.render(in: context.cgContext)
|
|
}.withRenderingMode(.alwaysTemplate)
|
|
}
|
|
}
|
|
}
|