无法从uitableviewcell为popover指定rect

时间:2014-07-30 03:32:36

标签: ios ipad uitableview uipopovercontroller

我以编程方式设置了一个popover,并尝试将其呈现出来 (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

使用以下代码:

popoverView.popoverContentSize = CGSizeMake(580, 760);
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
[popoverView presentPopoverFromRect:cell.bounds inView:tableView permittedArrowDirections:(UIPopoverArrowDirectionAny) animated:YES];

这样可以正常工作,但它会忽略大小,因此视图会被切断,因为单元格位于屏幕中间附近。当我将其更改为(UIPopoverArrowDirectionRight | UIPopoverArrowDirectionLeft)时,它也会忽略它并向上或向下显示弹出窗口。

我想要的是将popover显示在靠近单元格的左侧,以便它有空间可以打开到侧面,但每当我尝试编辑rect时,我会在tableview中遇到很多错误从...显示我尝试了很多不同的方法,例如:

UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
CGRect frame = CGRectMake(cell.bounds.origin.x, cell.bounds.origin.y, cell.bounds.size.width/4, cell.bounds.size.height);
[popoverView presentPopoverFromRect:frame inView:tableView permittedArrowDirections:(UIPopoverArrowDirectionAny) animated:YES];

无论我做什么,除非我使用第一个代码(FromRect:cell.bounds inView:tableView),否则会出现以下两个错误:

断言失败 - [UIPickerTableView _createPreparedCellForGlobalRow:withIndexPath:],/ SourceCache / UIKit_Sim / UIKit-2935.137 / UITableView.m:8357 *

由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'未设置UITableView数据源'*

但是tableview数据源肯定是设置的,当我尝试更改弹出窗口的矩形时,我只会遇到这些错误。我还尝试手动计算单元格的位置来获取框架而不是使用单元格,也就是通过将indexPath.row的单元格高度乘以y值...

关于为什么我会收到这些错误的任何想法?或者我如何从tableview中正确显示完整的弹出窗口?

编辑:此外,我根据单元格的边界获取单元格并创建框架没有问题。错误来自的行始终位于“presentPopoverFromRect:”行。

解决方案:我终于能够在没有任何错误的情况下实现使用CGRectOffset而不是来自单元格中心的popover所需的效果:

CGRect rect = [tableView convertRect:[tableView rectForRowAtIndexPath:indexPath] toView:tableView];
[popoverView presentPopoverFromRect:CGRectOffset(rect, -400, 0) inView:tableView permittedArrowDirections:(UIPopoverArrowDirectionAny) animated:YES];

另一个编辑:非常奇怪的是,该代码适用于我测试它的第一部分。但是我的tableview有2个部分,并且出于某种原因,popover在第二部分工作正常部分,但我仍然在第一部分得到错误?关于错误的任何想法??

2 个答案:

答案 0 :(得分:0)

使用tableview' rectForRowAtIndexPath方法获取rect

试试这个,

         CGRect rect = [tableView convertRect:[tableView rectForRowAtIndexPath:indexPath]
                                      toView:tableView];

        [popoverController presentPopoverFromRect:rect
                                           inView:tableView
                         permittedArrowDirections:UIPopoverArrowDirectionAny
                                         animated:YES];

答案 1 :(得分:0)

您的代码示例不太正确:

[popoverView presentPopoverFromRect:cell.bounds inView:tableView permittedArrowDirections:(UIPopoverArrowDirectionAny) animated:YES];

请记住cell.bounds的原点是(0,0),即bounds rect相对于单元格的坐标系。因此,inView参数应为cell

[popoverView presentPopoverFromRect:cell.bounds inView:cell permittedArrowDirections:(UIPopoverArrowDirectionAny) animated:YES];

或者,您可以使用cell.frame在表格视图的坐标系中指定单元格的矩形:

[popoverView presentPopoverFromRect:cell.frame inView:tableView permittedArrowDirections:(UIPopoverArrowDirectionAny) animated:YES];

希望能让你走上正确的道路。

<强>更新

此外,报告并解决了同样的错误in this question