Estou tentando adicionar um UIPopoverView ao meu aplicativo Swift iOS 8, mas não consigo acessar a propriedade PopoverContentSize, pois o popover não aparece na forma correta. meu código:
var popover: UIPopoverController? = nil
func addCategory() {
var newCategory = storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: newCategory)
popover = UIPopoverController(contentViewController: nav)
popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
popover!.delegate = self
popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
resultado:
Quando estou fazendo a mesma coisa por meio de UIPopoverPresentationController, ainda não consigo fazer. este é o meu código:
func addCategory() {
var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController as UIPopoverPresentationController
popover.delegate = self
popover.popoverContentSize = CGSizeMake(1000, 300)
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
Recebo exatamente a mesma saída.
Como faço para personalizar o tamanho do meu popover? Qualquer ajuda seria muito apreciada!
Respostas:
Ok, um colega de casa deu uma olhada e descobriu:
Esse é o caminho.
Você não fala mais com o próprio popover, você fala com o controlador de visualização dentro dele para definir o tamanho do conteúdo, chamando a propriedade
preferredContentSize
fonte
Na verdade, é muito mais simples do que isso. No storyboard, você deve criar o viewcontroller que deseja usar como popover e criar uma classe viewcontroller para ele como de costume. Faça uma transição conforme mostrado abaixo a partir do objeto que você deseja abrir o popover, neste caso o
UIBarButton
chamado "Config".No "controlador de visualização mãe", implemente o
UIPopoverPresentationControllerDelegate
método e o delegado:Substitua o
prepareForSeque
método desta forma:E você está pronto. E agora você pode tratar a visualização popover como qualquer outra visualização, ou seja, adicione campos e quais não! E você obtém o controlador de conteúdo usando o
popoverPresentationController.presentedViewController
método noUIPopoverPresentationController
.Também em um iPhone, você teria que substituir
fonte
Encontrei um exemplo completo de como fazer tudo isso funcionar para que você possa sempre exibir um popover, não importa o dispositivo / orientação https://github.com/frogcjn/AdaptivePopover_iOS8_Swift .
A chave é implementar UIAdaptivePresentationControllerDelegate
Em seguida, estenda o exemplo acima (da Imagine Digital):
fonte
UIModalPresentationFullScreen
ouUIModalPresentationOverFullScreen
". Além disso, "Se você não implementar este método ou retornar qualquer estilo diferente deUIModalPresentationFullScreen
ouUIModalPresentationOverFullScreen
, o controlador de apresentação ajustará o estilo de apresentação aoUIModalPresentationFullScreen
estilo."Swift 2.0
Bem, eu malhei. Dar uma olhada. Feito um ViewController no StoryBoard. Associado à classe PopOverViewController.
Veja ViewController:
Nota: O método func showPopover (base: UIView) deve ser colocado antes de ViewDidLoad. Espero que ajude !
fonte
showPopover(base: UIView)
método deve ser colocado antesviewDidLoad()
?No iOS9, o UIPopoverController é depreciado. Então, pode usar o código abaixo para a versão Objective-C acima iOS9.x,
fonte
Aqui, eu converto o código Swift "Joris416" em Objective-c,
Lembre-se de ADICIONAR
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
fonte
Isso é melhor explicado no blog iOS8 Day-by-Day
Resumindo, depois de definir modalPresentationStyle do UIViewController como .Popover, você pode obter um UIPopoverPresentationClass (uma nova classe iOS8) por meio da propriedade popoverPresentationController do controlador.
fonte
Fiz uma versão Objective-C da resposta rápida da Imagine Digitals acima. Acho que não perdi nada, pois parece funcionar em testes preliminares, se você encontrar algo, me avise e eu irei atualizá-lo
fonte
popover.sourceView = self.view;
meus dois centavos pelo xcode 9.1 / swift 4.
e experimente em:
função adaptivePresentationStyle ...
ou: return .pageSheet .... e assim por diante ..
fonte
Implemente UIAdaptivePresentationControllerDelegate em seu Viewcontroller. Em seguida, adicione:
fonte
A seguir, um guia bastante abrangente sobre como configurar e apresentar popovers. https://www.appcoda.com/presentation-controllers-tutorial/
Em resumo, uma implementação viável (com algumas atualizações da sintaxe do artigo original para Swift 4.2 ), para então ser chamada de outro lugar, seria algo como o seguinte:
Muito disso já foi abordado na resposta de @mmc, mas o artigo ajuda a explicar alguns dos elementos de código usados e também mostra como eles podem ser expandidos.
Ele também fornece muitos detalhes adicionais sobre o uso da delegação para lidar com o estilo de apresentação para iPhone vs. iPad e para permitir a dispensa do popover se ele for mostrado em tela inteira. Novamente, atualizado para Swift 4.2 :
Espero que isto ajude.
fonte
Pra quem quer estudar!
Criei um projeto Open Source para quem deseja estudar e usar a visualização Popover para qualquer propósito. Você pode encontrar o projeto aqui. https://github.com/tryWabbit/KTListPopup
fonte