From ab9a93cb7ea4c231def9da88f076524eb7c66af4 Mon Sep 17 00:00:00 2001 From: senseiGai Date: Mon, 13 Apr 2026 14:48:29 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81:=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=20clipsToBounds=20=D1=81=20bubbleView,=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=20scrubbing=20=D0=B6=D0=B5=D1=81=D1=82=20=D0=BD?= =?UTF-8?q?=D0=B0=20waveform?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/Chats/ChatDetail/MessageVoiceView.swift | 4 ++++ .../Features/Chats/ChatDetail/NativeMessageCell.swift | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Rosetta/Features/Chats/ChatDetail/MessageVoiceView.swift b/Rosetta/Features/Chats/ChatDetail/MessageVoiceView.swift index c755690..659e43c 100644 --- a/Rosetta/Features/Chats/ChatDetail/MessageVoiceView.swift +++ b/Rosetta/Features/Chats/ChatDetail/MessageVoiceView.swift @@ -23,6 +23,10 @@ final class MessageVoiceView: UIView { private var totalDuration: TimeInterval = 0 // original duration for label reset /// Center of play button in this view's coordinate space (for external blob positioning). var playButtonCenter: CGPoint { playButton.center } + /// Whether the waveform is accepting scrub gestures (true during playback). + var isScrubbingEnabled: Bool { waveformView.enableScrubbing } + /// Frame of the waveform in this view's coordinate space. + var waveformFrame: CGRect { waveformView.frame } // MARK: - Layout Constants (Telegram exact: ChatMessageInteractiveFileNode) diff --git a/Rosetta/Features/Chats/ChatDetail/NativeMessageCell.swift b/Rosetta/Features/Chats/ChatDetail/NativeMessageCell.swift index ef9ba50..e83ad49 100644 --- a/Rosetta/Features/Chats/ChatDetail/NativeMessageCell.swift +++ b/Rosetta/Features/Chats/ChatDetail/NativeMessageCell.swift @@ -319,7 +319,6 @@ final class NativeMessageCell: UICollectionViewCell { // Raster bubble image (Telegram-exact tail) — added last so it renders above outline bubbleImageView.contentMode = .scaleToFill bubbleView.addSubview(bubbleImageView) - bubbleView.clipsToBounds = true // clips voice blob animation to bubble bounds contentView.addSubview(bubbleView) // Text (CoreTextLabel — no font/color/lines config; all baked into CoreTextTextLayout) @@ -3088,6 +3087,15 @@ extension NativeMessageCell: UIGestureRecognizerDelegate { override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { guard let pan = gestureRecognizer as? UIPanGestureRecognizer else { return true } if isInSelectionMode { return false } // No swipe in selection mode + + // If touch is on the waveform during playback, let the waveform's scrub gesture win + if !voiceView.isHidden, voiceView.isScrubbingEnabled { + let pointInVoice = pan.location(in: voiceView) + if voiceView.waveformFrame.contains(pointInVoice) { + return false + } + } + let velocity = pan.velocity(in: contentView) // Telegram: only left swipe (negative velocity.x), clear horizontal dominance return velocity.x < 0 && abs(velocity.x) > abs(velocity.y) * 2.0