From 1291d4b62ff361d6e3dc3d6dfcaa998a3e83608c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Sat, 8 Nov 2025 22:30:39 +0100 Subject: [PATCH] feat: Use glass view for emoji context menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- NextcloudTalk/Chat/ChatViewController.swift | 21 ++++++++++++++---- .../Extensions/UIViewExtensions.swift | 22 +++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/NextcloudTalk/Chat/ChatViewController.swift b/NextcloudTalk/Chat/ChatViewController.swift index a68c0608a..78551b822 100644 --- a/NextcloudTalk/Chat/ChatViewController.swift +++ b/NextcloudTalk/Chat/ChatViewController.swift @@ -2126,7 +2126,10 @@ import SwiftUI emojiShortcutButton.titleLabel?.font = .systemFont(ofSize: 20) emojiShortcutButton.setTitle(emoji, for: .normal) - emojiShortcutButton.backgroundColor = .systemBackground + + if #unavailable(iOS 26.0) { + emojiShortcutButton.backgroundColor = .systemBackground + } emojiShortcutButton.addAction { [weak self] in guard let self else { return } @@ -2157,7 +2160,11 @@ import SwiftUI addReactionButton.titleLabel?.font = .systemFont(ofSize: 22) addReactionButton.setImage(.init(systemName: "plus"), for: .normal) addReactionButton.tintColor = .label - addReactionButton.backgroundColor = .systemBackground + + if #unavailable(iOS 26.0) { + addReactionButton.backgroundColor = .systemBackground + } + addReactionButton.addAction { [weak self] in guard let self else { return } self.tableView?.contextMenuInteraction?.dismissMenu() @@ -2171,8 +2178,14 @@ import SwiftUI // The reactionView will be shown after the animation finishes, otherwise we see the view already when animating and this looks odd reactionView.alpha = 0 - reactionView.layer.cornerRadius = CGFloat(emojiButtonSize) / 2 - reactionView.backgroundColor = .systemBackground + + if #available(iOS 26.0, *) { + let effectView = reactionView.addGlassView() + effectView.layer.cornerRadius = CGFloat(emojiButtonSize) / 2 + } else { + reactionView.layer.cornerRadius = CGFloat(emojiButtonSize) / 2 + reactionView.backgroundColor = .systemBackground + } return reactionView } diff --git a/NextcloudTalk/User Interface/Extensions/UIViewExtensions.swift b/NextcloudTalk/User Interface/Extensions/UIViewExtensions.swift index 5abeaf4b3..dc84eba32 100644 --- a/NextcloudTalk/User Interface/Extensions/UIViewExtensions.swift +++ b/NextcloudTalk/User Interface/Extensions/UIViewExtensions.swift @@ -21,4 +21,26 @@ extension UIView { layer.render(in: rendererContext.cgContext) } } + + @available(iOS 26.0, *) + @discardableResult + func addGlassView(withStyle style: UIGlassEffect.Style = .regular) -> UIVisualEffectView { + self.backgroundColor = .clear + + let effectView = UIVisualEffectView() + self.insertSubview(effectView, at: 0) + + let glassEffect = UIGlassEffect(style: style) + effectView.effect = glassEffect + effectView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + effectView.leftAnchor.constraint(equalTo: self.leftAnchor), + effectView.rightAnchor.constraint(equalTo: self.rightAnchor), + effectView.topAnchor.constraint(equalTo: self.topAnchor), + effectView.bottomAnchor.constraint(equalTo: self.bottomAnchor) + ]) + + return effectView + } }