Ik probeer een UIPopoverView toe te voegen aan mijn Swift iOS 8-app, maar ik heb geen toegang tot de eigenschap PopoverContentSize, omdat de popover niet in de juiste vorm wordt weergegeven. mijn code:
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)
}
uitvoer:
Als ik hetzelfde doe via UIPopoverPresentationController, krijg ik het nog steeds niet voor elkaar. dit is mijn code:
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)
}
Ik krijg exact dezelfde uitvoer.
Hoe pas ik de grootte van mijn popover aan? Alle hulp wordt zeer op prijs gesteld!
Antwoord 1, autoriteit 100%
Ok, een huisgenoot keek ernaar en bedacht het:
func addCategory() {
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(500,600)
popover.delegate = self
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
Dat is de manier.
Je praat niet meer met de popover zelf, je praat met de viewcontroller erin om de inhoudsgrootte in te stellen, door de eigenschap preferredContentSize
aan te roepen
Antwoord 2, autoriteit 36%
Eigenlijk is het veel eenvoudiger dan dat. In het storyboard moet je de viewcontroller maken die je als popover wilt gebruiken en er zoals gewoonlijk een viewcontroller-klasse voor maken. Maak een segue zoals hieronder getoond van het object waarvan u de popover wilt openen, in dit geval de UIBarButton
met de naam “Config”.
In de “mother viewcontroller” implementeert u de UIPopoverPresentationControllerDelegate
en de delegate methode:
func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
//do som stuff from the popover
}
Overschrijf de methode prepareForSeque
als volgt:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//segue for the popover configuration window
if segue.identifier == "yourSegueIdentifierForPopOver" {
if let controller = segue.destinationViewController as? UIViewController {
controller.popoverPresentationController!.delegate = self
controller.preferredContentSize = CGSize(width: 320, height: 186)
}
}
}
En je bent klaar. En u kunt de popover-weergave nu behandelen als elke andere weergave, bijv. velden toevoegen en wat niet! En je krijgt de contentcontroller te pakken door de popoverPresentationController.presentedViewController
methode in de UIPopoverPresentationController
te gebruiken.
Ook op een iPhone zou je moeten overschrijven
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
Antwoord 3, autoriteit 19%
Ik heb een compleet voorbeeld gevonden van hoe je dit allemaal kunt laten werken, zodat je altijdeen popover kunt weergeven, ongeacht het apparaat/de oriëntatie https://github.com/frogcjn/AdaptivePopover_iOS8_Swift.
De sleutel is om UIAdaptivePresentationControllerDelegate te implementeren
func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -> UIModalPresentationStyle {
// This *forces* a popover to be displayed on the iPhone
return .None
}
Vervolg dan het bovenstaande voorbeeld (van Imagine Digital):
nav.popoverPresentationController!.delegate = implOfUIAPCDelegate
Antwoord 4, autoriteit 17%
Swift 2.0
Nou, het is gelukt. Even kijken. Een ViewController gemaakt in StoryBoard. Geassocieerd met PopOverViewController klasse.
import UIKit
class PopOverViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.preferredContentSize = CGSizeMake(200, 200)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "dismiss:")
}
func dismiss(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
Zie ViewController:
// ViewController.swift
import UIKit
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
func showPopover(base: UIView)
{
if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("popover") as? PopOverViewController {
let navController = UINavigationController(rootViewController: viewController)
navController.modalPresentationStyle = .Popover
if let pctrl = navController.popoverPresentationController {
pctrl.delegate = self
pctrl.sourceView = base
pctrl.sourceRect = base.bounds
self.presentViewController(navController, animated: true, completion: nil)
}
}
}
override func viewDidLoad(){
super.viewDidLoad()
}
@IBAction func onShow(sender: UIButton)
{
self.showPopover(sender)
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
}
Opmerking: De func showPopover(base: UIView) methode moet voor ViewDidLoad worden geplaatst. Ik hoop dat het helpt!
Antwoord 5, autoriteit 10%
In iOS9 wordt UIPopoverController afgeschreven. Dus kan de onderstaande code gebruiken voor Objective-C-versie boven iOS9.x,
- (IBAction)onclickPopover:(id)sender {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *viewController = [sb instantiateViewControllerWithIdentifier:@"popover"];
viewController.modalPresentationStyle = UIModalPresentationPopover;
viewController.popoverPresentationController.sourceView = self.popOverBtn;
viewController.popoverPresentationController.sourceRect = self.popOverBtn.bounds;
viewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:viewController animated:YES completion:nil]; }
Antwoord 6, autoriteit 6%
Hier converteer ik “Joris416” Swift-code naar Objective-c,
-(void) popoverstart
{
ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"PopoverView"];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
nav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popover = nav.popoverPresentationController;
controller.preferredContentSize = CGSizeMake(300, 200);
popover.delegate = self;
popover.sourceView = self.view;
popover.sourceRect = CGRectMake(100, 100, 0, 0);
popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:nav animated:YES completion:nil];
}
-(UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller
{
return UIModalPresentationNone;
}
Vergeet niet om toe te voegen
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
Antwoord 7, autoriteit 3%
Dit wordt het best uitgelegd op de iOS8 Dag-tot-dag blog
Kortom, als je de modalPresentationStyle van je UIViewController eenmaal hebt ingesteld op .Popover, kun je een UIPopoverPresentationClass (een nieuwe iOS8-klasse) krijgen via de popoverPresentationController-eigenschap van de controller.
Antwoord 8, autoriteit 2%
Ik heb hierboven een Objective-C-versie van het snelle antwoord van Imagine Digitals gemaakt. Ik denk niet dat ik iets heb gemist, aangezien het lijkt te werken onder voorlopige tests. Als je iets ziet, laat het me dan weten, dan zal ik het updaten
-(void) presentPopover
{
YourViewController* popoverContent = [[YourViewController alloc] init]; //this will be a subclass of UIViewController
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:popoverContent];
nav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popover = nav.popoverPresentationController;
popoverContent.preferredContentSize = CGSizeMake(500,600);
popover.delegate = self;
popover.sourceRect = CGRectMake(100,100,0,0); //I actually used popover.barButtonItem = self.myBarButton;
[self presentViewController:nav animated:YES completion:nil];
}
9
voor degenen die willen studeren!
Ik heb een open source-project gemaakt voor diegenen die popoverweergave willen studeren en gebruiken voor allesophitsen. Je kunt het project hier vinden. https://github.com/trywabbit/ktlistpopup