Popover correct presenteren in iOS 8

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:

voer hier de afbeeldingsbeschrijving in

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 UIBarButtonmet de naam “Config”.

voer hier de afbeeldingsbeschrijving in

In de “mother viewcontroller” implementeert u de UIPopoverPresentationControllerDelegateen de delegate methode:

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
    //do som stuff from the popover
}

Overschrijf de methode prepareForSequeals 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.presentedViewControllermethode in de UIPopoverPresentationControllerte 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

KTLISTNEWRESIZE

Other episodes