From 5fde879feabd643faf2b851e5bd53ded3958db28 Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:40:46 +0700 Subject: [PATCH] ios: better layout performance for chat item (#3911) * ios: better layout performance for chat item * different way of disabling menu * two fixes --------- Co-authored-by: Avently Co-authored-by: Evgeny Poberezkin --- .../Views/Chat/ChatItem/FramedItemView.swift | 1 + apps/ios/Shared/Views/Chat/ChatView.swift | 2 +- .../Shared/Views/Helpers/ContextMenu.swift | 31 ++++++++++++------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift index f7775a7cdd..3475e7a8b6 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift @@ -253,6 +253,7 @@ struct FramedItemView: View { ciQuotedMsgTextView(qi, lines: 3) } } + .fixedSize(horizontal: false, vertical: true) .padding(.top, 6) .padding(.horizontal, 12) } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 550a9a45b8..3ada57ef5d 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -646,7 +646,7 @@ struct ChatView: View { playbackState: $playbackState, playbackTime: $playbackTime ) - .uiKitContextMenu(menu: uiMenu, allowMenu: $allowMenu) + .uiKitContextMenu(maxWidth: maxWidth, menu: uiMenu, allowMenu: $allowMenu) .accessibilityLabel("") if ci.content.msgContent != nil && (ci.meta.itemDeleted == nil || revealed) && ci.reactions.count > 0 { chatItemReactions(ci) diff --git a/apps/ios/Shared/Views/Helpers/ContextMenu.swift b/apps/ios/Shared/Views/Helpers/ContextMenu.swift index 287aba5262..3b82d6eb95 100644 --- a/apps/ios/Shared/Views/Helpers/ContextMenu.swift +++ b/apps/ios/Shared/Views/Helpers/ContextMenu.swift @@ -11,26 +11,31 @@ import UIKit import SwiftUI extension View { - func uiKitContextMenu(menu: Binding, allowMenu: Binding) -> some View { - self.overlay { - if allowMenu.wrappedValue { - self.overlay(Color(uiColor: .systemBackground)).overlay(InteractionView(content: self, menu: menu)) - } + func uiKitContextMenu(maxWidth: CGFloat, menu: Binding, allowMenu: Binding) -> some View { + Group { + if allowMenu.wrappedValue { + InteractionView(content: self, maxWidth: maxWidth, menu: menu) + .fixedSize(horizontal: true, vertical: false) + } else { + self } + } } } -private struct InteractionConfig { - let content: Content - let menu: UIMenu +private class HostingViewHolder: UIView { + var contentSize: CGSize = CGSizeMake(0, 0) + override var intrinsicContentSize: CGSize { get { contentSize } } } -private struct InteractionView: UIViewRepresentable { +struct InteractionView: UIViewRepresentable { let content: Content + var maxWidth: CGFloat @Binding var menu: UIMenu func makeUIView(context: Context) -> UIView { - let view = UIView() + let view = HostingViewHolder() + view.contentSize = CGSizeMake(maxWidth, .infinity) view.backgroundColor = .clear let hostView = UIHostingController(rootView: content) hostView.view.translatesAutoresizingMaskIntoConstraints = false @@ -44,12 +49,16 @@ private struct InteractionView: UIViewRepresentable { ] view.addSubview(hostView.view) view.addConstraints(constraints) + view.layer.cornerRadius = 18 + hostView.view.layer.cornerRadius = 18 let menuInteraction = UIContextMenuInteraction(delegate: context.coordinator) view.addInteraction(menuInteraction) return view } - func updateUIView(_ uiView: UIView, context: Context) {} + func updateUIView(_ uiView: UIView, context: Context) { + (uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(maxWidth, .infinity)) + } func makeCoordinator() -> Coordinator { Coordinator(self)