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.
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)