mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Swift
		
	
| 
								 
											7 years ago
										 
									 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import UIKit.UIGestureRecognizerSubclass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public struct PanDirection: OptionSet {
							 | 
						||
| 
								 | 
							
								    public let rawValue: Int
							 | 
						||
| 
								 | 
							
								    public init(rawValue: Int) {
							 | 
						||
| 
								 | 
							
								        self.rawValue = rawValue
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static let left  = PanDirection(rawValue: 1 << 0)
							 | 
						||
| 
								 | 
							
								    public static let right = PanDirection(rawValue: 1 << 1)
							 | 
						||
| 
								 | 
							
								    public static let up    = PanDirection(rawValue: 1 << 2)
							 | 
						||
| 
								 | 
							
								    public static let down  = PanDirection(rawValue: 1 << 3)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static let horizontal: PanDirection = [.left, .right]
							 | 
						||
| 
								 | 
							
								    public static let vertical: PanDirection = [.up, .down]
							 | 
						||
| 
								 | 
							
								    public static let any: PanDirection = [.left, .right, .up, .down]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public class DirectionalPanGestureRecognizer: UIPanGestureRecognizer {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let direction: PanDirection
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public init(direction: PanDirection, target: AnyObject, action: Selector) {
							 | 
						||
| 
								 | 
							
								        self.direction = direction
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        super.init(target: target, action: action)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    override public func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
							 | 
						||
| 
								 | 
							
								        // Only start gesture if it's initially in the specified direction.
							 | 
						||
| 
								 | 
							
								        if state == .possible {
							 | 
						||
| 
								 | 
							
								            guard let touch = touches.first else {
							 | 
						||
| 
								 | 
							
								                return
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            let previousLocation = touch.previousLocation(in: view)
							 | 
						||
| 
								 | 
							
								            let location = touch.location(in: view)
							 | 
						||
| 
								 | 
							
								            let deltaY = previousLocation.y - location.y
							 | 
						||
| 
								 | 
							
								            let deltaX = previousLocation.x - location.x
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            let isSatisified: Bool = {
							 | 
						||
| 
								 | 
							
								                if abs(deltaY) > abs(deltaX) {
							 | 
						||
| 
								 | 
							
								                    if direction.contains(.up) && deltaY < 0 {
							 | 
						||
| 
								 | 
							
								                        return true
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if direction.contains(.down) && deltaY > 0 {
							 | 
						||
| 
								 | 
							
								                        return true
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                } else {
							 | 
						||
| 
								 | 
							
								                    if direction.contains(.left) && deltaX < 0 {
							 | 
						||
| 
								 | 
							
								                        return true
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if direction.contains(.right) && deltaX > 0 {
							 | 
						||
| 
								 | 
							
								                        return true
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                return false
							 | 
						||
| 
								 | 
							
								            }()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            guard isSatisified else {
							 | 
						||
| 
								 | 
							
								                return
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Gesture was already started, or in the correct direction.
							 | 
						||
| 
								 | 
							
								        super.touchesMoved(touches, with: event)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if state == .began {
							 | 
						||
| 
								 | 
							
								            let vel = velocity(in: view)
							 | 
						||
| 
								 | 
							
								            switch direction {
							 | 
						||
| 
								 | 
							
								            case .left, .right:
							 | 
						||
| 
								 | 
							
								                if fabs(vel.y) > fabs(vel.x) {
							 | 
						||
| 
								 | 
							
								                    state = .cancelled
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            case .up, .down:
							 | 
						||
| 
								 | 
							
								                if fabs(vel.x) > fabs(vel.y) {
							 | 
						||
| 
								 | 
							
								                    state = .cancelled
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								                break
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |