首先我想说的是我对ipad / ipod / iphone的开发,以及Objective-c的新手。
话虽如此,我正在尝试开发一个针对iPad的小应用程序,使用Xcode和IB,基本上,我有一个表,对于表中的每个UITableViewCell,我添加到accessoryView一个包含一个按钮的按钮图像。
以下是代码:
UIImage *img = [UIImage imageNamed:@"myimage.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake(0.0, 0.0, img.size.width, img.size.height);
button.frame = frame; // match the button's size with the image size
[button setBackgroundImage:img forState:UIControlStateNormal];
// set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet
[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor clearColor];
cell.accessoryView = button;
到目前为止,非常好,现在问题是当用户点击单元的accessoryView上的按钮时,我想要一个PopOver控件出现。
我在tableView的“accessoryButtonTappedForRowWithIndexPath”上尝试了这个:
UITableViewCell *cell = [myTable cellForRowAtIndexPath:indexPath];
UIButton *button = (UIButton *)cell.accessoryView;
//customViewController is the controller of the view that I want to be displayed by the PopOver controller
customViewController = [[CustomViewController alloc]init];
popOverController = [[UIPopoverController alloc]
initWithContentViewController: customViewController];
popOverController.popoverContentSize = CGSizeMake(147, 122);
CGRect rect = button.frame;
[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
这段代码的问题是它在应用程序View的顶部显示了Popover,而调试时我看到了“rect”的值,它们是:
x = 267
y = 13
所以我认为很明显为什么PopOver会在视图中显示出来,所以我的问题是,如何才能让PopOver的正确值显示在单元的accessoryView上的按钮下方?
另外,正如你所看到的,我告诉它使用“cell.accessoryView”作为“inView:”属性,这样可以吗?
答案 0 :(得分:8)
尝试使用button.bounds
代替button.frame
,因为rect是相对inView
的。
另请注意,如果单元格位于屏幕底部附近,则弹出窗口可能无法以正确的大小显示,因为您正在向上方向强制箭头。你应该手动处理这个,或者只使用Any。
答案 1 :(得分:1)
[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
将inView:cell.accessoryView更改为inView:cell
答案 2 :(得分:1)
这里是swift:
let cell = tableView.cellForRowAtIndexPath(indexPath)
let rect = tableView.convertRect(tableView.rectForRowAtIndexPath(indexPath), toView: tableView)
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("loadZone") as! UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(100,200)
popover!.sourceView = tableView
popover!.sourceRect = rect
self.presentViewController(nav, animated: true, completion: nil)