iosipaduipopovercontroller

Prevent animation on UIPopover dismissed by tap outside?


When a user taps outside the popover, the dismissal is animated. Is there a way to set that dismissal animation to NO? I have googled and searched on Stack extensively.

The docs for UIPopover state:

When displayed, taps outside of the popover window cause the popover to be dismissed automatically. To allow the user to interact with the specified views and not dismiss the popover, you can assign one or more views to the passthroughViews property. Taps inside the popover window do not automatically cause the popover to be dismissed. Your view and view controller code must handle actions and events inside the popover explicitly and call the dismissPopoverAnimated: method as needed.

I have implemented the dismissPopoverAnimated: method with NO and that works great for all the cases when I call that method.

The problem is when a user taps outside the popover to dismiss, dismissPopoverAnimated: is not called.

taps outside of the popover window cause the popover to be dismissed automatically.

And that dismissal is animated. There seems to be no way to control that dismissal. I am using the popover to present a color picker for a drawing app. Taps to draw are not registered until the popover has finished animating out. This creates a noticeable delay as you are not able to draw immediately but must wait for the animation to complete.

I thought that - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController could work but there is no way AFAIK to set the animation property in this method. Just return yes or no.

Is there a different method I can implement to be able to set the animation to NO?


Solution

  • In the view controller that presents your UIPopoverController, conform to the UIPopoverControllerDelegate protocol and implement the following delegate method. I just tested this and it does dismiss the popover without animation.

    - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
    {
        [self.myPopoverController dismissPopoverAnimated:NO];
        return YES;
    }
    

    Just make sure that you have set the delegate of your popover controller to the view controller that implements this.