我在一个项目中注意到,由于某种原因,一个弹出窗口位于右侧的按钮项目上的位置似乎偏离了右侧.我已经尝试使用UIButton的自定义视图,然后从该按钮显示popover,但popover似乎忽略showFromRect,如果我实际提供它的“居中”值.
这背后的代码很简单:
- (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"share"] style:UIBarButtonItemStylePlain target:self action:@selector(shareTap:)]; self.navigationItem.rightBarButtonItem = button; } - (void)shareTap:(UIBarButtonItem *)button { self.popover = [[UIPopoverController alloc] initWithContentViewController:[[UIViewController alloc] init]]; [self.popover presentPopoverFromBarButtonItem:button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; }
现在,如果我转到使用内部按钮,如上所述,我看到类似的行为(注意颜色变化,所以图像显示).
这个代码还是比较简单的:
- (void)viewDidLoad { [super viewDidLoad]; UIButton *innerButton = [[UIButton alloc] initWithFrame:CGRectMake(0,22,22)]; [innerButton setImage:[UIImage imageNamed:@"share"] forState:UIControlStateNormal]; [innerButton addTarget:self action:@selector(shareTap:) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:innerButton];; } - (void)shareTap:(UIButton *)button { self.popover = [[UIPopoverController alloc] initWithContentViewController:[[UIViewController alloc] init]]; // CGRect bottomCenter = CGRectMake(button.frame.size.width / 2,button.frame.size.height,1,1); CGRect bottomCenter = CGRectMake(2,1); [self.popover presentPopoverFromRect:bottomCenter inView:button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; }
请注意,不用使用实际的中心,我使用了任意值,如果我使用1或0,则弹出窗口左对齐.任何大于一个都是正确的对齐.
我搜索了一些类似的问题,但我似乎找不到有同样问题的人.关于什么导致这个或如何避免的任何想法将不胜感激.我唯一可以猜到的是,由于它靠近边缘,苹果做了一些定位巫术,迫使它成为他们想要的地方.问题是,右上角的按钮似乎是一个非常标准的下拉位置.
编辑:我已经确认,在本地邮件应用程序的“新消息”图标上长按可能会发生同样的情况.
编辑2:我能够与苹果确认这是一个问题.在最新的版本之一(我不记得我认为的9个中的哪一个),他们就这样做了,所以你可以手动设置这个.默认的行为仍然是错误的我相信(我没有尝试过一段时间),但是您可以使用CGRect偏移方法使其正常工作,如果你这么倾向.
解决方法
尝试这个自定义Popover Controller – WYPopoverController(
https://github.com/nicolaschengdev/WYPopoverController)来修复问题.