2014-10-14 6 views
6

Mit UIPopovercontroller unter iOS8.0 in iPhone funktioniert gut mit diesem Code. Aber in ios8 zeigt es weißen Bildschirm an.UIPopoverController für iphone in ios8 zeigt weißen Bildschirm

Code:

pickerController = [[UIViewController alloc] init]; 
UIView *viewV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 160)]; 
[viewV setBackgroundColor:[UIColor clearColor]]; 
popOverController = [[UIPopoverController alloc] initWithContentViewController:pickerController]; 
popOverController.popoverContentSize = CGSizeMake(150, 160); 
[popOverController setDelegate:self]; 

CGRect ImageBtnFrame = [self.view convertRect:sender.frame fromView:self.view];  
[popOverController presentPopoverFromRect:ImageBtnFrame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 

Jede Alternative für ios8, brauchen Vorschlag.

Antwort

2

Versuchen Sie, die neue iOS 8 API für Popovers zu verwenden.

pickerController = [[UIViewController alloc] init]; 
UIView *viewV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 160)]; 
[viewV setBackgroundColor:[UIColor clearColor]]; 

UIPopoverPresentationController *popOverController = pickerController .popoverPresentationController; 
popOverController.popoverContentSize = CGSizeMake(150, 160); 
[popOverController setDelegate:self]; 

popOverController.sourceView = self.view; 
popOverController.sourceRect = sender.frame; 
popOverController.permittedArrowDirections = UIPopoverArrowDirectionUp; 

[self presentViewController:popOverController 
        animated:YES 
        completion:nil]; 
+3

'[self presentViewController: popOverController animiert: JA Abschluss: nil];' gibt eine Warnung: 'Nicht kompatible Zeigertypen 'UIPopoverPresentationController *' auf Parameter des Typs‚UIViewController * _Nonnull'' – ppaulojr

2

Das wird auf iOS 8 verursachen. Also, ich empfahl, folgende Github-Bibliothek zu verwenden. https://github.com/skywinder/ActionSheetPicker-3.0 oder Sie können Code-Basis auf iOS-Version schreiben.

if (OLDER_THAN_IOS_8) { 
     // Your regular code 
     pickerController = [[UIViewController alloc] init]; 
     UIView *viewV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 160)]; 
     [viewV setBackgroundColor:[UIColor clearColor]]; 
     popOverController = [[UIPopoverController alloc] initWithContentViewController:pickerController]; 
     popOverController.popoverContentSize = CGSizeMake(150, 160); 
     [popOverController setDelegate:self]; 

     CGRect ImageBtnFrame = [self.view convertRect:sender.frame fromView:self.view];  
     [popOverController presentPopoverFromRect:ImageBtnFrame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 

    } else { 

    // New Code that support iOS -8 using UIPopoverPresentationController 
    // Checkout @AndreasZ answer for the same 
    } 
11

Nach 2014 WWDC, in der 30-Minuten-Marke, die richtige Antwort ist:

- (void) tapButton:(id) sender 
{ 
    MyViewControllerClass * vc = [[MyViewControllerClass alloc] init]; 
    vc.modalPresentationStyle = UIModalPresentationPopover; 

    UIPopoverPresentationController * popOverController = vc.popoverPresentationController; 
    [popOverController setDelegate:self]; 
    popOverController.sourceView = sender; 
    popOverController.sourceRect = ((UIButton*)sender).frame; 
    popOverController.permittedArrowDirections = UIPopoverArrowDirectionUp; 

    [self presentViewController:vc 
         animated:YES 
        completion:nil]; 
} 

Beachten Sie, dass die akzeptierte Antwort hat einige Probleme wie:

  • Nicht Einstellung der modalPresentationStyle
  • Präsentieren der UIPopoverPresentationController * anstelle der UIViewController
+0

Senden Ja, Sie haben Recht. Dies sollte die akzeptierte Antwort sein. – rahul