Eu tenho um UIView
iPhone como Springboard. Eu o criei usando um UIScrollView
e UIButtons
. Desejo desativar a rolagem horizontal na referida visualização de rolagem. Eu quero apenas rolagem vertical. Como faço isso?
ios
objective-c
uiscrollview
Rahul Vyas
fonte
fonte
Respostas:
Você deve definir a
contentSize
propriedade doUIScrollView
. Por exemplo, se vocêUIScrollView
tiver 320 pixels de largura (a largura da tela), você pode fazer o seguinte:O
UIScrollView
irá então rolar apenas verticalmente, porque já pode exibir tudo horizontalmente.fonte
ATUALIZADO: (após @EranMarom apontar em seu comentário)
Você pode interromper a rolagem horizontal ou vertical no
ScrollViewDelegate
Método. Aqui é como,Para a rolagem horizontal:
Se você deseja rolar horizontalmente, você precisa aumentar o contentOffset.x. Impedindo que pare o scrollview scroll na direção horizontal.
Para a rolagem vertical:
Se você deseja rolar verticalmente, é necessário aumentar o contentOffset.y. Impedindo que pare a rolagem scrollview na direção vertical.
O código acima impede as mudanças em
x
ey
de ascrollview contentOffset
e leva a interromper a rolagem noscrollViewDidScroll:
método.fonte
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
para desativar a rolagem horizontal. Acho que é mais legível, é menor e não faz sentido fazer o teste para zero porque não há virtualmente nenhuma sobrecarga com código que é executado com pouca frequência (ou seja, algumas dezenas de vezes por segundo no máximo).scrollView.contentOffset.y = 0.0
para parar a rolagem vertical escrollView.contentOffset.x = 0.0
para parar a rolagem horizontal, nascrollViewDidScroll()
função de delegado. No entanto, acredito que certificar-se de quescrollView.contentSize
igual ascrollView.frame.size
é a melhor solução (correta). Veja a resposta de @danbeaulieu.desde iOS7 uso
// e criar seu rolador de página com 3 páginas
fonte
self.collectionView.pagingEnabled = YES;
me ajudou a resolver o problema com a rolagem suave (não arrastar). O problema estava no métodoscrollViewWillEndDragging:
- targetContentOffset era o mesmo que scrollView.contentOffset e a lógica de detecção de página não funciona corretamente.Crie duas saídas, uma para sua visualização e outra para sua visualização de rolagem:
Em seguida, em viewDidLayoutSubviews, você pode adicionar o seguinte código:
O que fizemos foi coletar a altura e largura da visualização e definir o tamanho do conteúdo scrollViews para corresponder a ele. Isso impedirá que a sua visualização de rolagem role horizontalmente.
Mais pensamentos:
CGSizeMake obtém largura e altura usando CGFloats. Você pode precisar usar sua altura existente de UIScrollViews para o segundo parâmetro. Que ficaria assim:
fonte
No meu caso, com o Swift 4.2 você pode usar:
Desativar rolagem vertical:
Desativar rolagem horizontal:
fonte
Você pode selecionar a visualização e, em seguida,
Attributes Inspector
desmarcarUser Interaction Enabled
.fonte
No meu caso, a largura de contentView era maior do que a largura de UIScrollView e esse era o motivo da rolagem horizontal indesejada. Eu resolvi isso definindo a largura de contentView igual à largura de UIScrollView.
Espero que ajude alguém
fonte
Eu tinha o tableview contentInset definido em viewDidLoad (como abaixo) que o que causava a rolagem horizontal
Verifique se há algum tableview contentInset definido por diferentes motivos e desative-o
fonte
Lutei com isso por algum tempo, tentando sem sucesso as várias sugestões neste e em outros tópicos.
No entanto, em outro segmento (não tenho certeza de onde), alguém sugeriu que usar uma restrição negativa no UIScrollView funcionou para ele.
Então, tentei várias combinações de restrições com resultados inconsistentes. O que funcionou para mim foi adicionar restrições iniciais e finais de -32 à visualização de rolagem e adicionar uma visualização de texto (invisível) com largura de 320 (e centralizada).
fonte
Experimente isto:
fonte
Desative a rolagem horizontal substituindo a
contentOffset
propriedade na subclasse.fonte
Introduzido no iOS 11 é uma nova propriedade em
UIScrollView
A documentação afirma que você:
Juntamente com quaisquer outras restrições autoLayout que você pode ser a adição de que você vai querer restringir a
widthAnchor
dosUIScrollView
'scontentLayoutGuide
para ser o mesmo tamanho que o 'frame'. Você pode usar oframeLayoutGuide
(também introduzido no iOS 11) ou qualquer largura externa (como o seusuperView
).exemplo:
Documentação: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
fonte
Uma vez que fiz isso substituindo o UIScrollView por um UITableView com apenas 1 célula, funcionou bem.
fonte
Use esta única linha.
self.automaticallyAdjustsScrollViewInsets = NO;
fonte