Como você sabe qual é a página / visualização atual exibida dentro de um UIPageViewController
?
Eu substituí o viewDidAppear
método de minhas visualizações filhas, para que eles enviem um id para a visualização pai em seu viewDidAppear
método.
No entanto, o problema é o seguinte: não consigo usar esse id como id para a página exibida de forma confiável. porque se o usuário virar a página, mas na metade decidir parar de virar e colocar a página de volta, viewDidAppear
já terá sido chamado. (a visualização é visível atrás da página enrolada).
Talvez eu só deva mudar para um novo id se a visão atual desaparecer. Mas será que não existe uma maneira mais simples de retornar a vista que está visível atualmente?
viewDidAppear:animated:
?Respostas:
Você deve controlar manualmente a página atual. O método delegado
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
dirá quando atualizar essa variável. O último argumento do métodotransitionCompleted:
pode informar se um usuário concluiu uma transição de virada de página ou não.fonte
No iOS 6, descobri que a
viewControllers
propriedade de UIPageViewController é atualizada constantemente para que sempre mantenha o controlador de visualização que representa a página atual e nada mais. Assim, você pode acessar a página atual chamandoviewControllers[0]
(assumindo que você mostre apenas um controlador de visualização por vez).O array viewController é atualizado apenas quando a página "bloqueia" no lugar, portanto, se um usuário decidir revelar parcialmente a próxima página, ela não se tornará a página "atual" a menos que conclua a transição.
Se você quiser acompanhar os "números de página", atribua aos seus controladores de visualização um valor de índice conforme você os cria através dos métodos de fonte de dados UIPageViewController.
Então, por exemplo:
Mas observe os comentários de que isso não é confiável.
fonte
viewControllers
propriedade e obtenho os controladores de vista corretos, mas quando giro, no métodospineLocationForInterfaceOrientation
, não consigo mais os controladores de vista corretos. Portanto, mantive minha própria propriedade currentPage em vez de depender sempre doviewControllers
.Infelizmente, todos os métodos acima não me ajudaram. No entanto, encontrei a solução usando tags. Pode ser que não seja o melhor, mas funciona e espero que ajude alguém:
Em Swift: (obrigado a @Jessy )
Exemplo: essência
fonte
Com base na resposta de Ole ...
É assim que implementei os 4 métodos para rastrear a página atual e atualizar o indicador da página para o índice correto:
fonte
self.nextIndex = self.currentIndex
vez deself.nextIndex = 0
restaurar o índice corretamente quando uma transição não for concluída. Caso contrário, você corre o risco de acabar com umcurrentIndex
valor 0 ao paginar rapidamente para frente e para trás em algum lugar no meio de suas páginas.A solução abaixo funcionou para mim.
A Apple poderia evitar muitos problemas tornando a paginação da visualização de rolagem UIPageViewController mais configurável. Tive que recorrer à sobreposição de um novo UIView e UIPageControl apenas porque a paginação UIPageViewController nativa não suporta um fundo transparente ou reposicionamento dentro do quadro de exibição.
fonte
Swift 4
Nenhum código desnecessário. 3 maneiras de fazer isso. Usando o método UIPageViewControllerDelegate .
fonte
pageViewController.viewControllers
. Como você conhece viewControllers? .First é o que está em questão?Estou acompanhando o índice da página usando uma pequena função e especificando pageIndex como NSInteger estático.
e chamar
[self setPageIndex];
dentro da função especificada por Ole e também depois de detectar a mudança na orientação.fonte
Usei a solução do Corey pela primeira vez, mas não estava funcionando no iOS5, então acabei usando,
Ele tentou alternar entre páginas diferentes e funciona bem por enquanto.
fonte
Infelizmente, nada acima funciona para mim.
Eu tenho dois controladores de visualização e quando eu levemente (cerca de 20px) rolar a última visualização para trás, ele aciona o delegado:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
e dizendo que a página atual (índice) é
0
está errada.Usando delegate dentro do viewController filho, algo como:
que é acionado internamente
viewDidAppear
como:Funcionou para mim.
fonte
Isso funciona para mim de forma confiável
Eu tenho um UIPageController personalizado. Esta pageController.currentPage é atualizada a partir do UIViewController exibido no viewWillAppear
fonte
Tenho usado
view.tag
por um tempo agora, tentar manter o controle da página atual era muito complicado.Neste código, o índice é armazenado dentro da
tag
propriedade de cada umview
e é usado para buscar o próximo VC ou o anterior. Usando este método também é possível criar um pergaminho infinito. Confira o comentário no código para visualizar esta solução também:fonte
Obrigado pela sua resposta pessoal, enfrentei problema semelhante, tive que armazenar o índice. Eu modifico ligeiramente meu código, colo-o abaixo:
fonte
fonte
Abaixo, o código de demonstração (em Swift 2) que demonstra como isso é feito implementando um tutorial simples de swiper de imagem. Comentários no próprio código:
fonte
Eu tenho uma matriz viewControllers, que exibo no UIPageViewController .
Coisa importante a notar aqui é que o setViewControllers método de UIPageViewController não dá qualquer retorno de chamada delegado. Os retornos de chamada delegados representam apenas ações de toque do usuário no UIPageViewController .
fonte
Esta é a solução que encontrei:
Uso:
Certifique-se de definir o título inicial
fonte
A maneira mais simples de abordar este IMHO é usar o PageControl para armazenar o resultado potencial da transição e, em seguida, reverter se a transição foi cancelada. Isso significa que o controle da página muda assim que o usuário começa a deslizar, o que está ok para mim. Isso requer que você tenha seu próprio array de UIViewControllers (neste exemplo, chamado
allViewControllers
)fonte
Que tal pedir um
viewController
diretamente doUIPageViewController
(versão Swift 4):Ou, se você só precisa do controlador de visualização apresentado atualmente em algum ponto do tempo, simplesmente use
pageViewController.viewControllers?.first
nesse momento.fonte
No swift 5 e seguinte resposta sirvine
Neste caso, eu não me importo com qual classe de UIViewController está embutida
fonte
Ele retornará o índice da página atual. e deve usar este código sob a função de delegado de UIPageViewController (didFinishAnimating).
fonte