Uma maneira comum de dispensar um modal é deslizar para baixo - Como permitimos que o usuário arraste o modal para baixo, se estiver longe o suficiente, o modal é dispensado, caso contrário, ele volta à posição original?
Por exemplo, podemos encontrar isso usado nas visualizações de fotos do aplicativo do Twitter ou no modo "descobrir" do Snapchat.
Tópicos semelhantes indicam que podemos usar um UISwipeGestureRecognizer e [self CC0ViewControllerAnimated ...] para descartar um VC modal quando um usuário desliza para baixo. Mas isso só lida com um único toque, não permitindo que o usuário arraste o modal.
Respostas:
Acabei de criar um tutorial para arrastar interativamente um modal para descartá-lo.
http://www.thorntech.com/2016/02/ios-tutorial-close-modal-dragging/
Achei este tópico confuso no início, então o tutorial desenvolve isso passo a passo.
Se você deseja apenas executar o código sozinho, este é o repo:
https://github.com/ThornTechPublic/InteractiveModal
Esta é a abordagem que usei:
Ver controlador
Você substitui a animação dispensada por uma personalizada. Se o usuário estiver arrastando o modal, ele
interactor
entra em ação.Dispensar animador
Você cria um animador personalizado. Esta é uma animação personalizada que você empacota dentro de um
UIViewControllerAnimatedTransitioning
protocolo.Interator
Você cria
UIPercentDrivenInteractiveTransition
uma subclasse para que ela possa atuar como sua máquina de estado. Como o objeto interagente é acessado por ambos os VCs, use-o para controlar o progresso da panorâmica.Modal View Controller
Isso mapeia o estado do gesto panorâmico para chamadas de método do interator. O
translationInView()
y
valor determina se o usuário ultrapassou um limite. Quando o gesto de panorâmica é.Ended
, o interator termina ou cancela.fonte
segue
comoover current context
para evitar a tela preta na parte de trás ao puxar o viewControllerVou compartilhar como fiz isso no Swift 3:
Resultado
Implementação
Onde os Modals View Controllers herdam de um
class
que eu construí (ViewControllerPannable
) para torná-los arrastáveis e dispensáveis quando atingem certa velocidade.Classe ViewControllerPannable
fonte
Storyboard segue
deMainViewController
paraModalViewController
: defina a propriedade Presentation para Over Current ContextAqui está uma solução de um arquivo com base na resposta de @ wilson (obrigado 👍) com as seguintes melhorias:
Lista de melhorias da solução anterior
y
coordenada deview.frame.origin
let y = max(0, translation.y)
currentPositionTouched
eoriginalPosition
minimumVelocityToHide
: qual velocidade é suficiente para ocultar (o padrão é 1500)minimumScreenRatioToHide
: quão baixo é o suficiente para ocultar (o padrão é 0,5)animationDuration
: quão rápido nós escondemos / mostramos (o padrão é 0.2s)Solução
Swift 3 e Swift 4:
fonte
minimumScreenRatioToHide
)self.view.frame.origin
before you callsliceViewVerticallyTo
pela primeira vez: parece que o deslocamento que vemos é o mesmo que a altura da barra de status, então talvez sua origem inicial não seja 0?slideViewVerticallyTo
como uma função aninhada emonPan
.criou uma demonstração para arrastar interativamente para baixo para dispensar o controlador de visualização como o modo de descoberta do snapchat. Verifique este github para ver o projeto de amostra.
fonte
Swift 4.x, usando Pangesture
Maneira simples
Vertical
Função auxiliar
Jeito difícil
Consulte isto -> https://github.com/satishVekariya/DraggableViewController
fonte
modalPresentationStyle = UIModalPresentationOverFullScreen
para evitar a tela traseira atrás doview
.Eu descobri uma maneira super simples de fazer isso. Basta colocar o seguinte código em seu controlador de visualização:
Swift 4
fonte
Atualiza massivamente o repo para Swift 4 .
Para o Swift 3 , criei o seguinte para apresentar um
UIViewController
da direita para a esquerda e descartá-lo com o gesto de panorâmica. Eu carreguei isso como um repositório GitHub .DismissOnPanGesture.swift
Arquivo:Fácil uso:
fonte
O que você está descrevendo é uma animação de transição personalizada interativa . Você está personalizando a animação e o gesto de condução de uma transição, ou seja, a dispensa (ou não) de um controlador de visualização apresentado. A maneira mais fácil de implementá-lo é combinando um UIPanGestureRecognizer com um UIPercentDrivenInteractiveTransition.
Meu livro explica como fazer isso e postei exemplos (do livro). Este exemplo particular é uma situação diferente - a transição é lateral, não para baixo, e é para um controlador de barra de guias, não um controlador apresentado - mas a ideia básica é exatamente a mesma:
https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch06p296customAnimation2/ch19p620customAnimation1/AppDelegate.swift
Se você baixar esse projeto e executá-lo, verá que o que está acontecendo é exatamente o que você está descrevendo, exceto que é lateral: se o arrasto for mais da metade, fazemos a transição, mas se não, cancelamos e voltamos a Lugar, colocar.
fonte
Apenas dispensa vertical
fonte
Eu criei uma extensão fácil de usar.
Apenas inerente seu UIViewController com InteractiveViewController e você está pronto para InteractiveViewController
chame o método showInteractive () de seu controlador para mostrar como interativo.
fonte
Em Objective C: Aqui está o código
no
viewDidLoad
fonte
Aqui está uma extensão que fiz com base na resposta de @Wilson:
USO
Dentro de seu controlador de visualização, você deseja deslizar:
e será dispensável deslizando do lado esquerdo do controlador de visualização, como um controlador de navegação.
fonte
Esta é minha classe simples para arrastar ViewController do eixo . Acabei de herdar sua classe de DraggableViewController.
Funciona apenas para o ViewController apresentado.
fonte
Para aqueles que realmente querem mergulhar um pouco mais fundo na transição UIViewController personalizada, eu recomendo este ótimo tutorial de raywenderlich.com .
O projeto de amostra final original contém bug. Então, eu corrigi e carreguei no repositório Github . O proj está em Swift 5, portanto você pode executá-lo e reproduzi-lo facilmente.
Aqui está uma prévia:
E é interativo também!
Feliz hackeamento!
fonte
Você pode usar um UIPanGestureRecognizer para detectar o arrasto do usuário e mover a visualização modal com ele. Se a posição final estiver longe o suficiente, a vista pode ser descartada ou animada de volta à sua posição original.
Confira esta resposta para obter mais informações sobre como implementar algo assim.
fonte