UIPanGestureRecognizer를 사용하여 패닝되는 방향을 어떻게 캡처 할 수 있습니까?
좋아, 나는 멀티 터치 제스처를 캡처하기 위해 태양 아래에서 거의 모든 옵션을 둘러 보았고 마침내 완전히 원을 그리며 UIPanGestureRecognizer로 돌아 왔습니다.
내가 원하는 기능은 정말 간단합니다. 두 손가락 팬 제스처를 설정했으며 이동하는 픽셀 수에 따라 일부 이미지를 섞을 수 있기를 원합니다. 모든 것이 잘 풀렸지 만 팬 제스처가 반전되면 캡처 할 수 있기를 원합니다.
제스처로 되돌아가는 것을 감지하지 못하는 내장 방식이 있습니까? 원래 시작점을 저장 한 다음 끝점을 추적 한 다음 그 이후로 이동하는 위치를 확인하고 초기 끝점보다 작은 지 확인한 다음 그에 따라 반대로해야합니까? 나는 그것이 작동하는 것을 볼 수 있지만 더 우아한 해결책이 있기를 바랍니다!
감사
편집하다:
다음은 인식기가 실행되도록 설정된 방법입니다. 약간의 해킹이지만 작동합니다.
-(void) throttle:(UIGestureRecognizer *) recognize{
throttleCounter ++;
if(throttleCounter == 6){
throttleCounter = 0;
[self nextPic:nil];
}
UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *) recognize;
UIView *view = recognize.view;
if(panGesture.state == UIGestureRecognizerStateBegan){
CGPoint translation = [panGesture translationInView:view.superview];
NSLog(@"X: %f, Y:%f", translation.x, translation.y);
}else if(panGesture.state == UIGestureRecognizerStateEnded){
CGPoint translation = [panGesture translationInView:view.superview];
NSLog(@"X: %f, Y:%f", translation.x, translation.y);
}
}
값 사이의 차이를 추적하기 시작하는 지점에 도달했습니다.
UIPanGestureRecognizer에서 -velocityInView : 를 사용 하여 제스처가 인식 된 시점의 손가락 속도를 얻을 수 있습니다 .
예를 들어 오른쪽 팬에서 한 가지 작업을하고 왼쪽 팬에서 한 작업을 수행하려면 다음과 같이 할 수 있습니다.
- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
CGPoint velocity = [gestureRecognizer velocityInView:yourView];
if(velocity.x > 0)
{
NSLog(@"gesture went right");
}
else
{
NSLog(@"gesture went left");
}
}
새로운 속도를 이전 속도와 비교하고 그것이 반대 방향인지 확인하려는 경우와 같이 말 그대로 반전을 감지하려면 다음을 수행 할 수 있습니다.
// assuming lastGestureVelocity is a class variable...
- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
CGPoint velocity = [gestureRecognizer velocityInView:yourView];
if(velocity.x*lastGestureVelocity.x + velocity.y*lastGestureVelocity.y > 0)
{
NSLog(@"gesture went in the same direction");
}
else
{
NSLog(@"gesture went in the opposite direction");
}
lastGestureVelocity = velocity;
}
곱하기와 더하기가 약간 이상하게 보일 수 있습니다. 실제로 내적이지만 제스처가 같은 방향이면 양수, 정확히 직각이면 0으로 내려 가고 반대이면 음수가됩니다. 방향.
제스처 인식기가 시작되기 전에 쉽게 감지 할 수있는 방법은 다음과 같습니다.
public override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard let panRecognizer = gestureRecognizer as? UIPanGestureRecognizer else {
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
// Ensure it's a horizontal drag
let velocity = panRecognizer.velocity(in: self)
if abs(velocity.y) > abs(velocity.x) {
return false
}
return true
}
수직으로 만 드래그하려면 x
및을 전환 할 수 있습니다 y
.
Serghei Catraniuc의이 코드는 나를 위해 더 잘 작동했습니다. https://github.com/serp1412/LazyTransitions
func addPanGestureRecognizers() {
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(respondToSwipeGesture(gesture:)))
self.view.addGestureRecognizer(panGesture)
}
func respondToSwipeGesture(gesture: UIGestureRecognizer){
if let swipeGesture = gesture as? UIPanGestureRecognizer{
switch gesture.state {
case .began:
print("began")
case .ended:
print("ended")
switch swipeGesture.direction{
case .rightToLeft:
print("rightToLeft")
case .leftToRight:
print("leftToRight")
case .topToBottom:
print("topToBottom")
case .bottomToTop:
print("bottomToTop")
default:
print("default")
}
default: break
}
}
}
// 확장
import Foundation
import UIKit
public enum UIPanGestureRecognizerDirection {
case undefined
case bottomToTop
case topToBottom
case rightToLeft
case leftToRight
}
public enum TransitionOrientation {
case unknown
case topToBottom
case bottomToTop
case leftToRight
case rightToLeft
}
extension UIPanGestureRecognizer {
public var direction: UIPanGestureRecognizerDirection {
let velocity = self.velocity(in: view)
let isVertical = fabs(velocity.y) > fabs(velocity.x)
var direction: UIPanGestureRecognizerDirection
if isVertical {
direction = velocity.y > 0 ? .topToBottom : .bottomToTop
} else {
direction = velocity.x > 0 ? .leftToRight : .rightToLeft
}
return direction
}
public func isQuickSwipe(for orientation: TransitionOrientation) -> Bool {
let velocity = self.velocity(in: view)
return isQuickSwipeForVelocity(velocity, for: orientation)
}
private func isQuickSwipeForVelocity(_ velocity: CGPoint, for orientation: TransitionOrientation) -> Bool {
switch orientation {
case .unknown : return false
case .topToBottom : return velocity.y > 1000
case .bottomToTop : return velocity.y < -1000
case .leftToRight : return velocity.x > 1000
case .rightToLeft : return velocity.x < -1000
}
}
}
extension UIPanGestureRecognizer {
typealias GestureHandlingTuple = (gesture: UIPanGestureRecognizer? , handle: (UIPanGestureRecognizer) -> ())
fileprivate static var handlers = [GestureHandlingTuple]()
public convenience init(gestureHandle: @escaping (UIPanGestureRecognizer) -> ()) {
self.init()
UIPanGestureRecognizer.cleanup()
set(gestureHandle: gestureHandle)
}
public func set(gestureHandle: @escaping (UIPanGestureRecognizer) -> ()) {
weak var weakSelf = self
let tuple = (weakSelf, gestureHandle)
UIPanGestureRecognizer.handlers.append(tuple)
addTarget(self, action: #selector(handleGesture))
}
fileprivate static func cleanup() {
handlers = handlers.filter { $0.0?.view != nil }
}
@objc private func handleGesture(_ gesture: UIPanGestureRecognizer) {
let handleTuples = UIPanGestureRecognizer.handlers.filter{ $0.gesture === self }
handleTuples.forEach { $0.handle(gesture)}
}
}
extension UIPanGestureRecognizerDirection {
public var orientation: TransitionOrientation {
switch self {
case .rightToLeft: return .rightToLeft
case .leftToRight: return .leftToRight
case .bottomToTop: return .bottomToTop
case .topToBottom: return .topToBottom
default: return .unknown
}
}
}
extension UIPanGestureRecognizerDirection {
public var isHorizontal: Bool {
switch self {
case .rightToLeft, .leftToRight:
return true
default:
return false
}
}
}
'IT Share you' 카테고리의 다른 글
UILabel의 실제 줄 수를 찾는 방법은 무엇입니까? (0) | 2020.12.09 |
---|---|
jquery 애니메이션 배경 위치 (0) | 2020.12.09 |
UITableView를 특정 위치로 스크롤하는 방법 (0) | 2020.12.09 |
Subversion 잠금 오류를 수정하는 방법 (0) | 2020.12.09 |
XML 스타일을 사용하여 Android에서 사용자 지정 단추를 만드는 방법 (0) | 2020.12.09 |