No meu caso, pai UIViewController
contém o UIPageViewController
que contém o UINavigationController
que contém UIViewController
. Preciso adicionar um gesto de furto ao último controlador de exibição, mas os furtos são tratados como se pertencessem ao controlador de exibição de página. Tentei fazer isso programaticamente e via xib, mas sem resultado.
Então, pelo que entendi, não posso alcançar meu objetivo até UIPageViewController
lidar com seus gestos. Como resolver este problema?
ios
uiviewcontroller
uigesturerecognizer
uipageviewcontroller
user2159978
fonte
fonte
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
temUINavigationController
. O cliente quer pop controlador de navegação no gesto de furto (se é possível), mas pega controlador de visualização da página furtos em vezRespostas:
A maneira documentada de impedir a
UIPageViewController
rolagem é não atribuir adataSource
propriedade. Se você atribuir a fonte de dados, ela passará para o modo de navegação 'baseado em gestos', que é o que você está tentando impedir.Sem uma fonte de dados, você fornece manualmente os controladores de exibição quando quiser com o
setViewControllers:direction:animated:completion
método e ele se moverá entre os controladores de exibição sob demanda.O acima pode ser deduzido da documentação do UIPageViewController da Apple (visão geral, segundo parágrafo):
fonte
fonte
for (UIView *view in self.pageViewController.view.subviews) {
Traduzo resposta do usuário2159978 para Swift 5.1
fonte
Implementando a solução @ lee (@ user2159978) como uma extensão:
Uso: (in
UIPageViewController
)fonte
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
Estou lutando contra isso há um tempo e achei que deveria postar minha solução, seguindo a resposta de Jessedc; removendo a fonte de dados do PageViewController.
Adicionei isso à minha classe PgeViewController (vinculada ao meu controlador de exibição de página no storyboard, herda tanto
UIPageViewController
eUIPageViewControllerDataSource
):Isso pode ser chamado quando cada sub-visualização aparecer (neste caso, para desativá-la);
Espero que isso ajude alguém, não é tão limpo quanto eu gostaria, mas não parece muito hacky etc.
EDIT: Se alguém quiser traduzir isso em Objective-C, por favor :)
fonte
Editar : esta resposta funciona apenas para o estilo de ondulação da página. A resposta de Jessedc é muito melhor: funciona independentemente do estilo e depende de comportamento documentado .
UIPageViewController
expõe sua variedade de reconhecedores de gestos, que você pode usar para desativá-los:fonte
Se você deseja
UIPageViewController
manter sua capacidade de deslizar, enquanto permite que seus controles de conteúdo usem seus recursos (deslize para excluir etc.), basta desativarcanCancelContentTouches
oUIPageViewController
.Coloque isso no seu
UIPageViewController
'sviewDidLoad
func. (Rápido)O
UIPageViewController
possui uma subvisão gerada automaticamente que lida com os gestos. Podemos impedir que essas subvisões cancelem gestos de conteúdo.De...
Deslize para excluir em um tableView que esteja dentro de um pageViewController
fonte
Uma extensão útil
UIPageViewController
para ativar e desativar o furto.fonte
Eu resolvi assim (Swift 4.1)
fonte
Maneira rápida para a resposta @lee
fonte
Similar to @ user3568340 resposta
Swift 4
fonte
Graças à resposta de @ user2159978.
Eu faço isso um pouco mais compreensível.
fonte
As respostas que encontrei me parecem muito confusas ou incompletas, então aqui está uma solução completa e configurável:
Passo 1:
Dê a cada um dos seus elementos de PVC a responsabilidade de saber se a rolagem esquerda e direita está ativada ou não.
Cada um dos seus controladores de exibição de PVC deve implementar o protocolo acima.
Passo 2:
Nos controladores de PVC, desative a rolagem, se necessário:
Etapa 3:
Adicione os métodos eficazes de bloqueio de rolagem ao seu PVC:
Passo 4:
Atualize os atributos relacionados à rolagem ao acessar uma nova tela (se você passar para alguma tela manualmente, não se esqueça de chamar o método enableScroll):
fonte
Há uma abordagem muito mais simples do que a maioria das respostas sugeridas aqui, que é retornar
nil
nos retornos de chamadaviewControllerBefore
eviewControllerAfter
dataSource.Isso desativa o gesto de rolagem nos dispositivos iOS 11+, mantendo a possibilidade de usar o
dataSource
(para itens como opresentationIndex
/presentationCount
usado para o indicador da página)Também desativa a navegação via. os
pageControl
(os pontos na parte inferior)fonte
pageViewController.view.isUserInteractionEnabled = false
fonte
Traduzindo a resposta de @ user2159978 para C #:
fonte
(Swift 4) Você pode remover os reconhecedores de gestos da sua páginaViewController:
Se você preferir em extensão:
e
pageViewController.removeGestureRecognizers
fonte
Declare assim:
Em seguida, use-o assim:
fonte
Enumerar as subvisões para encontrar o scrollView de um
UIPageViewController
não funcionou para mim, pois não consigo encontrar nenhum scrollView na subclasse do controlador de página. Então, o que pensei em fazer é desativar os reconhecedores de gestos, mas com cuidado o suficiente para não desativar os necessários.Então eu vim com isso:
Coloque isso dentro do
viewDidLoad()
e está tudo pronto!fonte
Adicione isso na sua classe pageviewcontroller. 100% trabalhando
fonte
basta adicionar esta propriedade de controle à sua subclasse UIPageViewController :
fonte