From 40b19cfef2efe72c0f4857fd57e38d4829c93c3d Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Wed, 19 Mar 2025 18:51:04 +0100 Subject: [PATCH] Check idea from https://github.com/TelegramMessenger/Telegram-iOS/pull/1712/commits/be6bc8845d20930d2335dfc8695bad3a75144166 --- .../ChatListFilterTabContainerNode.swift | 22 ++++---- .../Display/Source/ContextGesture.swift | 20 +++++--- ...pLongTapOrDoubleTapGestureRecognizer.swift | 20 +++++--- .../SwipeToDismissGestureRecognizer.swift | 28 ++++++----- .../Sources/ChatInputPanelContainer.swift | 50 ++++++++++--------- 5 files changed, 80 insertions(+), 60 deletions(-) diff --git a/submodules/ChatListUI/Sources/ChatListFilterTabContainerNode.swift b/submodules/ChatListUI/Sources/ChatListFilterTabContainerNode.swift index bb483ad278..4d647eb616 100644 --- a/submodules/ChatListUI/Sources/ChatListFilterTabContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListFilterTabContainerNode.swift @@ -1038,7 +1038,19 @@ private class ReorderingGestureRecognizerTimerTarget: NSObject { } } +private final class InternalGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if otherGestureRecognizer is UIPanGestureRecognizer { + return true + } else { + return false + } + } +} + private final class ReorderingGestureRecognizer: UIGestureRecognizer, UIGestureRecognizerDelegate { + private let internalDelegate = InternalGestureRecognizerDelegate() + private let shouldBegin: (CGPoint) -> Bool private let began: (CGPoint) -> Void private let ended: () -> Void @@ -1057,7 +1069,7 @@ private final class ReorderingGestureRecognizer: UIGestureRecognizer, UIGestureR super.init(target: nil, action: nil) - self.delegate = self + self.delegate = self.internalDelegate } override func reset() { @@ -1069,14 +1081,6 @@ private final class ReorderingGestureRecognizer: UIGestureRecognizer, UIGestureR self.currentLocation = nil } - func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { - if otherGestureRecognizer is UIPanGestureRecognizer { - return true - } else { - return false - } - } - override func touchesBegan(_ touches: Set, with event: UIEvent) { super.touchesBegan(touches, with: event) diff --git a/submodules/Display/Source/ContextGesture.swift b/submodules/Display/Source/ContextGesture.swift index a64d42a57e..700074e4c0 100644 --- a/submodules/Display/Source/ContextGesture.swift +++ b/submodules/Display/Source/ContextGesture.swift @@ -62,7 +62,18 @@ private func cancelOtherGestures(gesture: ContextGesture, view: UIView) { } } +private final class InternalGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if otherGestureRecognizer is UIPanGestureRecognizer { + return false + } + return true + } +} + public final class ContextGesture: UIGestureRecognizer, UIGestureRecognizerDelegate { + private let internalDelegate = InternalGestureRecognizerDelegate() + public var beginDelay: Double = 0.12 public var activateOnTap: Bool = false private var currentProgress: CGFloat = 0.0 @@ -82,7 +93,7 @@ public final class ContextGesture: UIGestureRecognizer, UIGestureRecognizerDeleg override public init(target: Any?, action: Selector?) { super.init(target: target, action: action) - self.delegate = self + self.delegate = self.internalDelegate } override public func reset() { @@ -101,13 +112,6 @@ public final class ContextGesture: UIGestureRecognizer, UIGestureRecognizerDeleg self.wasActivated = false } - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { - if otherGestureRecognizer is UIPanGestureRecognizer { - return false - } - return true - } - override public func touchesBegan(_ touches: Set, with event: UIEvent) { super.touchesBegan(touches, with: event) diff --git a/submodules/Display/Source/TapLongTapOrDoubleTapGestureRecognizer.swift b/submodules/Display/Source/TapLongTapOrDoubleTapGestureRecognizer.swift index a6e37daf86..59afecdc0f 100644 --- a/submodules/Display/Source/TapLongTapOrDoubleTapGestureRecognizer.swift +++ b/submodules/Display/Source/TapLongTapOrDoubleTapGestureRecognizer.swift @@ -72,7 +72,18 @@ public enum TapLongTapOrDoubleTapGestureRecognizerAction { case keepWithSingleTap } +private final class InternalGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if otherGestureRecognizer is UIPanGestureRecognizer { + return false + } + return false + } +} + public final class TapLongTapOrDoubleTapGestureRecognizer: UIGestureRecognizer, UIGestureRecognizerDelegate { + private let internalDelegate = InternalGestureRecognizerDelegate() + private var touchLocationAndTimestamp: (CGPoint, Double)? private var touchCount: Int = 0 private var tapCount: Int = 0 @@ -96,14 +107,7 @@ public final class TapLongTapOrDoubleTapGestureRecognizer: UIGestureRecognizer, override public init(target: Any?, action: Selector?) { super.init(target: target, action: action) - self.delegate = self - } - - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { - if otherGestureRecognizer is UIPanGestureRecognizer { - return false - } - return false + self.delegate = self.internalDelegate } override public func reset() { diff --git a/submodules/SwipeToDismissGesture/Sources/SwipeToDismissGestureRecognizer.swift b/submodules/SwipeToDismissGesture/Sources/SwipeToDismissGestureRecognizer.swift index b4d5253883..cac2f3bd8d 100644 --- a/submodules/SwipeToDismissGesture/Sources/SwipeToDismissGestureRecognizer.swift +++ b/submodules/SwipeToDismissGesture/Sources/SwipeToDismissGestureRecognizer.swift @@ -15,13 +15,28 @@ private func traceScrollView(view: UIView, point: CGPoint) -> UIScrollView? { return nil } +private final class InternalGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } + + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if otherGestureRecognizer is UIPanGestureRecognizer { + return true + } + return false + } +} + public class SwipeToDismissGestureRecognizer: UIGestureRecognizer, UIGestureRecognizerDelegate { + private let internalDelegate = InternalGestureRecognizerDelegate() + private var beginPosition = CGPoint() override public init(target: Any?, action: Selector?) { super.init(target: target, action: action) - self.delegate = self + self.delegate = self.internalDelegate } override public func reset() { @@ -30,10 +45,6 @@ public class SwipeToDismissGestureRecognizer: UIGestureRecognizer, UIGestureReco self.state = .possible } - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { - return true - } - override public func touchesBegan(_ touches: Set, with event: UIEvent) { super.touchesBegan(touches, with: event) @@ -101,11 +112,4 @@ public class SwipeToDismissGestureRecognizer: UIGestureRecognizer, UIGestureReco self.state = .failed } - - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { - if otherGestureRecognizer is UIPanGestureRecognizer { - return true - } - return false - } } diff --git a/submodules/TelegramUI/Components/ChatInputPanelContainer/Sources/ChatInputPanelContainer.swift b/submodules/TelegramUI/Components/ChatInputPanelContainer/Sources/ChatInputPanelContainer.swift index 56280fc3c9..249d202f88 100644 --- a/submodules/TelegramUI/Components/ChatInputPanelContainer/Sources/ChatInputPanelContainer.swift +++ b/submodules/TelegramUI/Components/ChatInputPanelContainer/Sources/ChatInputPanelContainer.swift @@ -34,7 +34,33 @@ private func traceScrollViewUp(view: UIView) -> UIScrollView? { } } +private final class InternalGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if let _ = otherGestureRecognizer.view as? PagerExpandableScrollView { + return true + } + + if let _ = gestureRecognizer as? PagerPanGestureRecognizer { + return true + } + + return true + } + + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if let _ = otherGestureRecognizer.view as? PagerExpandableScrollView { + return true + } + if otherGestureRecognizer is UIPanGestureRecognizer { + return true + } + return false + } +} + private final class ExpansionPanRecognizer: UIGestureRecognizer, UIGestureRecognizerDelegate { + private let internalDelegate = InternalGestureRecognizerDelegate() + enum LockDirection { case up case down @@ -49,7 +75,7 @@ private final class ExpansionPanRecognizer: UIGestureRecognizer, UIGestureRecogn override public init(target: Any?, action: Selector?) { super.init(target: target, action: action) - self.delegate = self + self.delegate = self.internalDelegate } override public func reset() { @@ -59,28 +85,6 @@ private final class ExpansionPanRecognizer: UIGestureRecognizer, UIGestureRecogn self.currentTranslation = CGPoint() } - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { - if let _ = otherGestureRecognizer.view as? PagerExpandableScrollView { - return true - } - - if let _ = gestureRecognizer as? PagerPanGestureRecognizer { - return true - } - - return true - } - - public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { - if let _ = otherGestureRecognizer.view as? PagerExpandableScrollView { - return true - } - if otherGestureRecognizer is UIPanGestureRecognizer { - return true - } - return false - } - override public func touchesBegan(_ touches: Set, with event: UIEvent) { super.touchesBegan(touches, with: event)