Eu tenho uma visão que tem UIPanGestureRecognizer
que arrastar a visão verticalmente. Portanto, no retorno de chamada do reconhecedor, apenas atualizo a coordenada y para movê-lo. A super visão dessa visão, tem uma UIPanGestureRecognizer
que arrastará a visão horizontalmente, apenas atualizando a coordenada x.
O problema é que o primeiro UIPanGestureRecognizer
é levar o evento para mover a vista verticalmente, então não posso usar o gesto de superview.
eu tentei
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
e ambos vão funcionar, mas eu não quero isso. Quero que a horizontal seja detectada apenas se o movimento for claramente horizontal. Portanto, seria ótimo se UIPanGestureRecognizer
tivesse uma propriedade direction.
Como posso conseguir esse comportamento? Acho os documentos muito confusos, então talvez alguém possa explicar melhor aqui.
fonte
Respostas:
Basta fazer isso no reconhecedor de gesto de panorâmica vertical, ele funciona para mim:
E para Swift:
fonte
velocityInView
vez detranslationInView
.Criei uma solução com subclasse como na resposta que o @LocoMike forneceu, mas usei o mecanismo de detecção mais eficaz pela velocidade inicial, conforme fornecido pelo @Hejazi. Também estou usando o Swift, mas isso deve ser fácil de traduzir para Obj-C, se desejado.
Vantagens sobre outras soluções:
Aqui está o código:
Exemplo de uso:
fonte
UIPanGestureRecognizer
.let horizontalPanRecognizer = PanDirectionGestureRecognizer(direction: .horizontal, target: self, action: #selector(handleHorizontalPanGesture(recognizer:))) self.view?.addGestureRecognizer(horizontalPanRecognizer); let verticalPanRecognizer = PanDirectionGestureRecognizer(direction: .vertical, target: self, action: #selector(handleVerticalPanGesture(recognizer:))) self.view?.addGestureRecognizer(verticalPanRecognizer);
Eu descobri isso criando uma subclasse de UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Isso só acionará o gesto se o usuário começar a arrastar o comportamento selecionado. Defina a propriedade direction como um valor correto e está tudo pronto.
fonte
initWithTarget:action:
método e chamado reset e tudo estava bem.DirectionPanGestureRecognizer
, desconsidera os drags rápidos, a menos que você definakDirectionPanThreshold = 20
ou não, caso em que pode emitir alarmes falsos. Sugiro colocar emabs(_moveX) > abs(_moveY)
vez deabs(_moveX) > kDirectionPanThreshold
e mudar caso horizontal, respectivamente._drag = YES
acrescenteiself.state = UIGestureRecognizerStateChanged;
Tentei restringir a área válida horizontalmente com o UIPanGestureRecognizer.
Em seguida, apenas deslizar horizontalmente dentro do grau thresholdAngle pode disparar esse gesto de panorâmica.
fonte
Resposta Swift 3.0: apenas lida com o gesto vertical
fonte
A seguinte solução resolveu meu problema:
Na verdade, basta verificar se o pan está na visualização principal ou no tableView.
fonte
Swift 3 versão da resposta de Lee para os preguiçosos
fonte
Peguei a resposta de Lee Goodrich e a estendi, pois precisava especificamente de uma única direção. Use-o assim:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
Também adicionei alguns comentários para tornar um pouco mais claro quais decisões estão realmente sendo tomadas.
fonte
override func touchesMoved
-Method does not override any method from its superclass
.Você pode encontrar a direção arrastando no
UIView
meioUIPanGestureRecognizer
. Por favor, siga o código.fonte
Swift 4.2
A solução é apenas para apoiar o gesto de panorâmica verticalmente, igual à horizontal.
Solução 1 :
Solução 2:
Em seguida, o gesto de furto engolirá o gesto de pan. Claro, você não precisa fazer nada
swipeAction
.fonte
Aqui está como eu resolvi:
Primeiro, ativei o reconhecimento simultâneo do PanGesture.
Em seguida, isole os gestos de deslocamento horizontal e vertical (o acumulador é a propriedade NSMutableArray):
Eu dei um exemplo aqui:
adicionar pan personalizada no scrollview
fonte
fonte
Você pode usar simples
panGestureRecognizer
. Não há necessidade de usarpandirectionregognizer
ou outras coisas. Basta usar o valor y dotranslationInview
código Abaixo, mover a visualização de arrastar apenas para cima e para baixofonte
Criei o método de ação PanGestureRecognizer @selector para o objeto que precisava apenas de rolagem horizontal.
fonte
Maneira rápida
fonte
Para todos os usuários Swift por aí, isso fará o trabalho :)
fonte
Tomei uma excelente resposta de Lee Goodrich e enviei para Swift 3
fonte
Gostaria muito de compartilhar minha abordagem, porque todas as outras abordagens são baseadas em uma
UIGestureRecognizerDelegate
ou em uma subclasseUIPanGestureRecognizer
.Minha abordagem é baseada em tempo de execução e swizzling. Não tenho 100% de certeza sobre essa abordagem, mas você pode testá-la e melhorá-la.
Defina a direção de qualquer um
UIPanGestureRecognizer
com apenas uma linha de código:use
pod 'UIPanGestureRecognizerDirection'
ou o código:fonte
Eu tentei isso: o que funcionou para mim de acordo com a pergunta descreve
fonte
SWIFT 4.2
Fui mais longe e fiz uma direção Pan Gesture:
(Usado: https://github.com/fastred/SloppySwiper e https://stackoverflow.com/a/30607392/5790492 )
fonte
Aqui está um gesto de deslocamento personalizado no Swift 5
U pode restringir sua direção e o ângulo máximo na direção, você também pode restringir sua velocidade mínima na direção.
chame assim:
ou
fonte
PanGestureRecognizer
A interface contém as seguintes definições:Não verifiquei isso, mas talvez seja acessível via subclasse.
fonte