Search code examples
iosobjective-cipaduipopovercontroller

Full Screen Custom Popover issue in iOS7 and iOS8


I am developing an app for iPad only. In which in for one functionality i want to display FullCustom Popover.

For that my code is as below:-

DuplicateViewController *viewControllerForPopover =
    [self.storyboard instantiateViewControllerWithIdentifier:@"DuplicatePopoverVC"];
    viewControllerForPopover.arr_studentDetail = self.arrStudentDetail;
    viewControllerForPopover.dictSelectedProg = dictSelectedProgram;

    self.popover = [[UIPopoverController alloc]
                    initWithContentViewController:viewControllerForPopover];
    [self.popover setPopoverContentSize:CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];

    viewControllerForPopover.modalPresentationStyle = UIModalPresentationFullScreen;
    [self.popover setBackgroundColor:[[UIColor darkGrayColor] colorWithAlphaComponent:0.4]];
    [self.popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:0 animated:YES];

I set popover size and tried with other option but can't make it full screen.

ViewDidLoad -> DuplicateViewController

[view_main.layer setBorderWidth:5.0f];
[view_main.layer setCornerRadius:25.0f];
[view_main.layer setBorderColor:[UIColor colorWithRed:(29.0f/255.0f) green:134.0f/255.0f blue:140.0f/255.0f alpha:1.0f].CGColor];

But while running App, It display as below:-

enter image description here

Please help me to display full screen Popover. Thank you so much in advance.


Solution

  • create two classes the first one should inherit UIPopoverController the second one should inherit UIPopoverBackgroundView

    for example:

    CustomUIPopoverController.h

    @interface CustomUIPopoverController : UIPopoverController
    

    CustomUIPopoverController.m

    @implementation CustomUIPopoverController
    
    - (id)initWithContentViewController:(UIViewController *)viewController {
        self = [super initWithContentViewController:viewController];
        if (self) {
            self.popoverBackgroundViewClass = [CustomUIClearPopoverBackgroundView class];
            [self setPopoverContentSize:viewController.view.frame.size];
        }
        return self;
    }
    

    @end

    CustomUIClearPopoverBackgroundView.h

    @interface CustomUIClearPopoverBackgroundView : UIPopoverBackgroundView
    

    CustomUIClearPopoverBackgroundView.m

    #import "CustomUIClearPopoverBackgroundView.h"
    
    @implementation CustomUIClearPopoverBackgroundView
    
    #pragma mark - no arrow
    
    + (CGFloat)arrowHeight {
        return 0;
    }
    
    + (CGFloat)arrowBase {
        return 0;
    }
    
    - (CGFloat)arrowOffset {
        return 0;
    }
    
    - (void)setArrowOffset:(CGFloat)arrowOffset {
    
    }
    
    - (UIPopoverArrowDirection)arrowDirection {
        return 0;
    }
    
    - (void)setArrowDirection:(UIPopoverArrowDirection)arrowDirection {
    }
    
    
    #pragma mark - no margins
    
    + (UIEdgeInsets)contentViewInsets {
        return UIEdgeInsetsZero;
    }
    
    #pragma mark - fully transparent (default is 0.15)
    
    +(BOOL)wantsDefaultContentAppearance {
    
        return NO;
    }
    
    - (void)willMoveToWindow:(UIWindow *)newWindow {
        [super willMoveToWindow:newWindow];
    
        // hide shadow image view
        [self.superview.subviews[0] setHidden:YES];
    }
    @end
    

    I used this but I don't like it very much. the second option is to create a container view and hide/show it as you like. this way it's a pure view controller and you don't need to mess with popup stuff to create the transparency, make your container view background = clear, the view controller view background color = clear, and add a semi-transparent button in the size of the view controller for the semi-transparent black background. on click of the button close the window (= same effect as tapping the popup background)