mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-28 12:19:54 +00:00
* ios: open chat on first unread, "scroll" to quoted items that were not loaded * more changes * changes * unused * fix reveal logic * debug * changes * test * Revert "test" This reverts commit553be124d5
. * change * change * changes * changes * changes * commented deceleration logic * changes * fixes * optimized item identifiers to use merged item directly * fixed counters * encreased initial and preload counters * fix initial loading and trimming items * optimize * allow marking read * 10 instead of 5 * performance * one more parameter in hash * disable trimming * performance * performance - in background * optimization * next/prev * changes * markread * finally * less logs * read * change after merge * trimming, edge cases * wait until items loaded * Revert "wait until items loaded" This reverts commit895218b978
. * progress indicator * optimization * disable scroll helper * experiment * Revert "experiment" This reverts commitc952c9e623
. * jump * no read * layoutIfNeeded * changes * EndlessScrollView * read * changes * changes * changes * reduce time to open a chat (by ~300ms) * open from the first unread when clicking member chat * refactored and removed unused code * handling search emptiness to scroll to correct position * changes * read state maintain * remove protocol * avoid parsing chatId * pass chat * changes * remove reveal * refactor spaghetti * remove ItemsScrollModel * rename * remove setUpdateListener * unused * optimization * scrollToTop * fix * scrollbar working again * scrollToBottom * fix * scrollBar hiding when not many items on screen * small safer change --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
52 lines
1.9 KiB
Swift
52 lines
1.9 KiB
Swift
//
|
|
// ScrollViewCells.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by Stanislav Dmitrenko on 27.01.2025.
|
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
protocol ReusableView {
|
|
func prepareForReuse()
|
|
}
|
|
|
|
/// `UIHostingConfiguration` back-port for iOS14 and iOS15
|
|
/// Implemented as a `UIView` that wraps and manages a generic `UIHostingController`
|
|
final class HostingCell<Hosted: View>: UIView, ReusableView {
|
|
private let hostingController = UIHostingController<Hosted?>(rootView: nil)
|
|
|
|
/// Updates content of the cell
|
|
/// For reference: https://noahgilmore.com/blog/swiftui-self-sizing-cells/
|
|
func set(content: Hosted, parent: UIViewController) {
|
|
hostingController.view.backgroundColor = .clear
|
|
hostingController.rootView = content
|
|
if let hostingView = hostingController.view {
|
|
hostingView.invalidateIntrinsicContentSize()
|
|
if hostingController.parent != parent { parent.addChild(hostingController) }
|
|
if !subviews.contains(hostingController.view) {
|
|
addSubview(hostingController.view)
|
|
hostingView.translatesAutoresizingMaskIntoConstraints = false
|
|
NSLayoutConstraint.activate([
|
|
hostingView.leadingAnchor
|
|
.constraint(equalTo: leadingAnchor),
|
|
hostingView.trailingAnchor
|
|
.constraint(equalTo: trailingAnchor),
|
|
hostingView.topAnchor
|
|
.constraint(equalTo: topAnchor),
|
|
hostingView.bottomAnchor
|
|
.constraint(equalTo: bottomAnchor)
|
|
])
|
|
}
|
|
if hostingController.parent != parent { hostingController.didMove(toParent: parent) }
|
|
} else {
|
|
fatalError("Hosting View not loaded \(hostingController)")
|
|
}
|
|
}
|
|
|
|
func prepareForReuse() {
|
|
//super.prepareForReuse()
|
|
hostingController.rootView = nil
|
|
}
|
|
}
|