Present UIPopoverController in same position with changing just arrow offset Present UIPopoverController in same position with changing just arrow offset ios ios

Present UIPopoverController in same position with changing just arrow offset


For my popover I wanted the arrow to be top-left instead of top-center (which is default).

I've managed to get the result below (screenshot) by setting the popoverLayoutMargins property of the UIPopoverController. You can use it to reduce the screen-area used in the internal calculations of the UIPopoverController to determine where to show the popover.

UIPopovercontroller arrow on the left

The code:

// Get the location and size of the control (button that says "Drinks")CGRect rect = control.frame;// Set the width to 1, this will put the anchorpoint on the left side// of the controlrect.size.width = 1;// Reduce the available screen for the popover by creating a left margin// The popover controller will assume that left side of the screen starts// at rect.origin.xpopoverC.popoverLayoutMargins = UIEdgeInsetsMake(0, rect.origin.x, 0, 0);// Simply present the popover (force arrow direction up)[popoverC presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

I think you'll be able to get the desired result by tweaking the above.


You can't do it as-is with Apple's built-in UIPopoverViewController class. But it should be fairly simple and logical to implement your own popover view controller (just some very basic 2D geometry and a bit of digging in UIView's docs).


Yes, you can do that. You have to create an aux view, with alpha=0.0f, and use it to guide the arrow.

For example:

auxView = [[UIView alloc] initWithFrame:firstButton.frame];auxView.alpha = 0.0 ;auxView.userInteractionEnabled = NO;[firstButton.superView addSubview:auxView];[auxView release];

Ok, now you open popover using that view as arrow's guide.

[thePopoverController presentPopoverFromRect:auxView.bounds inView:auxView            permitedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

And now you only have to move the view:

auxView.frame = secondButton.frame;

Use animations for that move if you want.

One more thing, for this kind of arrow to button, I prefer that the arrow touches the button. You can use:

presentPopoverFromRect:CGRectInset(auxView.bounds, 4.0, 4.0)