Eu tenho UIScrollView
apenas uma rolagem horizontal permitida e gostaria de saber em qual direção (esquerda, direita) o usuário rola. O que eu fiz foi subclassificar oUIScrollView
e substituir o touchesMoved
método:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
float now = [touch locationInView:self].x;
float before = [touch previousLocationInView:self].x;
NSLog(@"%f %f", before, now);
if (now > before){
right = NO;
NSLog(@"LEFT");
}
else{
right = YES;
NSLog(@"RIGHT");
}
}
Mas esse método às vezes não é chamado quando mudo. O que você acha?
iphone
ios
cocoa-touch
uiscrollview
Alex1987
fonte
fonte
Respostas:
Determinar a direção é bastante simples, mas lembre-se de que a direção pode mudar várias vezes ao longo de um gesto. Por exemplo, se você tiver uma visualização de rolagem com a paginação ativada e o usuário deslizar para a próxima página, a direção inicial poderá ser para a direita, mas se você tiver o salto ativado, ela não seguirá brevemente em nenhuma direção e depois, brevemente, indo para a esquerda.
Para determinar a direção, você precisará usar o
UIScrollView scrollViewDidScroll
delegado. Nesta amostra, criei uma variável denominadalastContentOffset
que eu uso para comparar o deslocamento do conteúdo atual com o anterior. Se for maior, o scrollView está rolando para a direita. Se for menor, o scrollView está rolando para a esquerda:Estou usando a enumeração a seguir para definir a direção. Definir o primeiro valor como ScrollDirectionNone tem o benefício adicional de tornar essa direção o padrão ao inicializar variáveis:
fonte
lastContentOffset = scrollView.contentOffset.x;
lastContentOffset
tipo. Em relação à propriedade versus variáveis estáticas: qualquer solução é uma boa escolha. Eu não tenho nenhuma preferência real. É um bom argumento.Nesse caso, no iOS 5 e superior, use o
UIScrollViewDelegate
para determinar a direção do gesto de panorâmica do usuário:fonte
Usar
scrollViewDidScroll:
é uma boa maneira de encontrar a direção atual.Se você quiser saber a direção após o usuário terminar a rolagem, use o seguinte:
fonte
Não há necessidade de adicionar uma variável extra para acompanhar isso. Basta usar o
UIScrollView
'spanGestureRecognizer
propriedade como esta. Infelizmente, isso funciona apenas se a velocidade não for 0:Você pode usar uma combinação de componentes xey para detectar cima, baixo, esquerda e direita.
fonte
A solução
fonte
velocityInView
vez detranslationInView
. Isso resolve o problema que surge ao mudar de direção no mesmo movimento.Swift 4:
Para a rolagem horizontal, você pode simplesmente fazer:
Para rolagem vertical, altere
.x
com.y
fonte
No iOS8 Swift, usei este método:
Eu tenho uma visualização dinâmica que altera os locais à medida que o usuário rola, para que a visualização pareça estar no mesmo lugar na tela. Também estou rastreando quando o usuário está subindo ou descendo.
Aqui também é uma maneira alternativa:
fonte
crollViewDidEndDecelerating
certo?Isto é o que funcionou para mim (no Objective-C):
fonte
fonte
Como alternativa, é possível observar o caminho principal "contentOffset". Isso é útil quando não é possível definir / alterar o delegado da exibição de rolagem.
Depois de adicionar o observador, você pode agora:
Lembre-se de remover o observador quando necessário. por exemplo, você pode adicionar o observador no viewWillAppear e removê-lo no viewWillDisappear
fonte
Em rápida:
Você também pode fazer isso em scrollViewDidScroll.
fonte
Aqui está minha solução para o comportamento, como na resposta @followben, mas sem perda com início lento (quando dy é 0)
fonte
Eu verifiquei algumas das respostas e elaborei na resposta do AnswerBot envolvendo tudo em uma gota na categoria UIScrollView. O "lastContentOffset" é salvo dentro da visualização uiscroll e, em seguida, basta chamar:
Código-fonte em https://github.com/tehjord/UIScrollViewScrollingDirection
fonte
Eu prefiro fazer alguma filtragem, com base na resposta de @ memmons
No Objetivo-C:
Quando testado em
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
:self.lastContentOffset
muda muito rápido, a diferença de valor é quase 0,5f.Não é necessário.
E, ocasionalmente, quando manuseada em condições precisas, sua orientação pode se perder. (as instruções de implementação são ignoradas às vezes)
tal como :
No Swift 4:
fonte
Quando a paginação está ativada, você pode usar esses códigos.
fonte
Códigos se explica, eu acho. Diferença CGFloat1 e diferença2 declaradas na mesma interface privada da classe. Bom se contentSize permanecer o mesmo.
fonte
Ok, então para mim esta implementação está funcionando muito bem:
Portanto, isso disparará o textView para descartar após o término do arrasto
fonte
Use este método delegado de scrollview.
Se y coordenada da velocidade for + ve rolagem, a visualização rola para baixo e, se for -ve rolagem, rolagem para cima. Da mesma forma, a rolagem esquerda e direita pode ser detectada usando x coordenadas.
fonte
Short & Easy seria, basta verificar o valor da velocidade, se for maior que zero, então a rolagem para a esquerda ou para a direita:
fonte
Se você trabalha com UIScrollView e UIPageControl, esse método também altera a exibição da página do PageControl.
Obrigado pelo código Swift de @Esq.
fonte
Swift 2.2 Solução simples que rastreia direções únicas e múltiplas sem nenhuma perda.
fonte
Nas respostas superiores, duas maneiras principais de resolver o problema é usar
panGestureRecognizer
orcontentOffset
. Ambos os métodos têm seus contras e prós.Método 1: panGestureRecognizer
Quando você usa o
panGestureRecognizer
que o @followben sugeriu, se você não quiser rolar programaticamente sua exibição de rolagem, ela funcionará corretamente.Contras
Mas se você mover a exibição de rolagem com o seguinte código, o código superior não poderá reconhecê-lo:
Método 2: contentOffset
Contras
Se você deseja alterar contentOffset programaticamente, durante a rolagem (como quando você deseja criar rolagem infinita), esse método causa problemas, porque você pode mudar
contentOffset
durante a alteração de locais de visualizações de conteúdo e, nesse momento, o salto superior do código é rolado para a direita ou para a direita. esquerda.fonte
Resposta de Mos6y https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004
fonte