Present UIPopoverController in same position with changing just arrow offset

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-08 23:11:12

问题


My goal is to keep same coordinates for a UIPopoverController with just changing arrow offset. So basically i have three buttons touching each of them shows up a popover. When presenting this popover it changes position on the screen, but i do not want that. To be more clear look at screenoshots:


回答1:


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 control
rect.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.x
popoverC.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.




回答2:


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




回答3:


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)


来源:https://stackoverflow.com/questions/11338316/present-uipopovercontroller-in-same-position-with-changing-just-arrow-offset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!