O Mobile Safari permite que você alterne as páginas inserindo uma espécie de visualização de paginação horizontal UIScrollView com um controle de página na parte inferior.
Estou tentando replicar esse comportamento específico em que um UIScrollView rolável horizontalmente mostra parte do conteúdo do próximo modo de exibição.
O exemplo fornecido pela Apple: PageControl mostra como usar um UIScrollView para paginação horizontal, mas todas as visualizações ocupam toda a largura da tela.
Como faço para que um UIScrollView mostre algum conteúdo da próxima exibição como o Safari móvel faz?
ios
iphone
cocoa-touch
uiscrollview
primeiro respondedor
fonte
fonte
Respostas:
Um
UIScrollView
com paginação habilitada irá parar em múltiplos de sua largura (ou altura) de quadro. Portanto, a primeira etapa é descobrir a largura que você deseja que suas páginas tenham. Faça com que seja a largura doUIScrollView
. Em seguida, defina os tamanhos de sua subvisualização com o tamanho que você precisa e defina seus centros com base nos múltiplos daUIScrollView
largura de.Então, desde que você quiser ver as outras páginas, é claro, definir
clipsToBounds
aNO
como mhjoy afirmou. O truque agora é fazer com que ele role quando o usuário começar a arrastar fora do intervalo doUIScrollView
quadro de. Minha solução (quando tive que fazer isso muito recentemente) foi a seguinte:Crie uma
UIView
subclasse (ou sejaClipView
) que conterá asUIScrollView
subvisões e suas. Essencialmente, deve ter a estrutura que você presumiriaUIScrollView
que teria em circunstâncias normais. Coloque oUIScrollView
no centro doClipView
. Certifique-se de que oClipView
'sclipsToBounds
esteja definido comoYES
se sua largura for menor que a de sua visualização pai. Além disso, oClipView
precisa de uma referência aoUIScrollView
.A etapa final é substituir
- (UIView *)hitTest:withEvent:
dentro doClipView
.Isso basicamente expande a área de toque do
UIScrollView
para o quadro da visão de seu pai, exatamente o que você precisa.Outra opção seria criar uma subclasse
UIScrollView
e sobrescrever seu- (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
método; entretanto, você ainda precisará de uma visualização de contêiner para fazer o recorte, e pode ser difícil determinar quando retornar comYES
base apenas noUIScrollView
quadro de.NOTA: Você também deve dar uma olhada no hitTest: withEvent: modificação de Juri Pakaste se estiver tendo problemas com a interação do usuário de subvisualização.
fonte
UIScrollView
subclasse para carregamento lento de visualizações (inlayoutSubviews
) e usei umclippingRect
para fazer opointInside:withEvent:
teste. Funciona muito bem e não requer visualização de contêiner adicional.UIScrollView
subclasse como @ohhorob mas com uma visão recipiente para recorte e retorno[super pointInside:CGPointMake(self.contentOffset.x + self.frame.size.width/2, self.contentOffset.y + self.frame.size.height/2) withEvent:event];
empointInside:withEvent:
. Isso funciona muito bem e não há problemas de interação com o usuário mencionados na resposta de @JuriPakaste.- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
adicionado ao UIScrollViewDelegate no iOS5 significa que você não precisa mais passar por esse palavrão.A
ClipView
solução acima funcionou para mim, mas tive que fazer uma-[UIView hitTest:withEvent:]
implementação diferente . A versão de Ed Marty não conseguiu interação do usuário trabalhando com scrollviews verticais que tenho dentro do horizontal.A seguinte versão funcionou para mim:
fonte
Defina o tamanho do quadro de scrollView como o tamanho das suas páginas seria:
Agora você pode fazer panorâmica
self.view
e o conteúdo em scrollView será rolado.Use também
scrollView.clipsToBounds = NO;
para evitar o corte do conteúdo.fonte
Acabei optando pelo UIScrollView personalizado, pois era o método mais rápido e simples que me parecia. No entanto, não vi nenhum código exato, então decidi compartilhar. Minhas necessidades eram de um UIScrollView que tinha conteúdo pequeno e, portanto, o próprio UIScrollView era pequeno para atingir o efeito de paginação. Como afirma a postagem, você não pode deslizar. Mas agora você pode.
Crie uma classe CustomScrollView e uma subclasse UIScrollView. Então, tudo o que você precisa fazer é adicionar isso ao arquivo .m:
Isso permite que você role de um lado para o outro (horizontal). Ajuste os limites de acordo para definir sua área de toque de deslizar / rolagem. Aproveitar!
fonte
Fiz outra implementação que pode retornar o scrollview automaticamente. Portanto, não é necessário ter um IBOutlet que limitará a reutilização no projeto.
fonte
Tenho outra modificação potencialmente útil para a implementação de hitTest do ClipView. Não gostei de ter que fornecer uma referência UIScrollView ao ClipView. Minha implementação abaixo permite que você reutilize a classe ClipView para expandir a área de teste de impacto de qualquer coisa, e não precisa fornecer uma referência.
fonte
Implementei a sugestão votada acima, mas
UICollectionView
eu estava usando considerava qualquer coisa fora do quadro como fora da tela. Isso fazia com que as células próximas fossem renderizadas fora dos limites apenas quando o usuário rolasse em direção a elas, o que não era o ideal.O que acabei fazendo foi emular o comportamento de um scrollview adicionando o método abaixo ao delegado (ou
UICollectionViewLayout
).Isso evita a delegação da ação de furto inteiramente, o que também foi um bônus. O
UIScrollViewDelegate
tem um método semelhante chamadoscrollViewWillEndDragging:withVelocity:targetContentOffset:
que pode ser usado para paginar UITableViews e UIScrollViews.fonte
Habilite o disparo de eventos de toque em visualizações secundárias da visualização de rolagem ao mesmo tempo em que apóia a técnica desta pergunta SO. Usa uma referência à visualização de rolagem (self.scrollView) para facilitar a leitura.
Adicione isso à visualização do seu filho para capturar o evento de toque:
(Esta é uma variação da solução do usuário 1856273. Limpo para facilitar a leitura e incorporou a correção do bug de Bartserk. Pensei em editar a resposta do usuário 1856273, mas era uma mudança muito grande para fazer.)
fonte
minha versão Pressionando o botão deitado no pergaminho - trabalho =)
mas apenas [[subvisualizações próprias] objectAtIndex: 0] deve ser um pergaminho
fonte
Aqui está uma resposta do Swift baseada na resposta de Ed Marty, mas também incluindo a modificação de Juri Pakaste para permitir toques nos botões, etc., dentro do scrollview.
fonte