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?
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?
Respostas:
Você deve definir a contentSize
propriedade do UIScrollView
. Por exemplo, se você UIScrollView
tiver 320 pixels de largura (a largura da tela), você pode fazer o seguinte:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
O UIScrollView
irá então rolar apenas verticalmente, porque já pode exibir tudo horizontalmente.
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.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
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.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
O código acima impede as mudanças em x
e y
de a scrollview contentOffset
e leva a interromper a rolagem no scrollViewDidScroll:
método.
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 e scrollView.contentOffset.x = 0.0
para parar a rolagem horizontal, na scrollViewDidScroll()
função de delegado. No entanto, acredito que certificar-se de que scrollView.contentSize
igual a scrollView.frame.size
é a melhor solução (correta). Veja a resposta de @danbeaulieu.
desde iOS7 uso
self.automaticallyAdjustsScrollViewInsets = NO;
// e criar seu rolador de página com 3 páginas
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
me ajudou a resolver o problema com a rolagem suave (não arrastar). O problema estava no método scrollViewWillEndDragging:
- targetContentOffset era o mesmo que scrollView.contentOffset e a lógica de detecção de página não funciona corretamente.
Solução rápida
Crie duas saídas, uma para sua visualização e outra para sua visualização de rolagem:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Em seguida, em viewDidLayoutSubviews, você pode adicionar o seguinte código:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
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:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
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
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).
Introduzido no iOS 11 é uma nova propriedade em UIScrollView
var contentLayoutGuide: UILayoutGuide
A documentação afirma que você:
Use este guia de layout quando quiser criar restrições de layout automático relacionadas à área de conteúdo de uma visualização de rolagem.
Juntamente com quaisquer outras restrições autoLayout que você pode ser a adição de que você vai querer restringir a widthAnchor
dos UIScrollView
'scontentLayoutGuide
para ser o mesmo tamanho que o 'frame'. Você pode usar o frameLayoutGuide
(também introduzido no iOS 11) ou qualquer largura externa (como o seusuperView
).
exemplo:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Documentação: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Uma vez que fiz isso substituindo o UIScrollView por um UITableView com apenas 1 célula, funcionou bem.
Use esta única linha.
self.automaticallyAdjustsScrollViewInsets = NO;