旋转时,UITableViewCell显示的UIPopoverController放置不正确

时间:2013-11-19 20:33:43

标签: ios uitableview uipopovercontroller

我有一个从UITableView中的UITableViewCell显示的弹出窗口,它是模态对话框中的唯一视图。这在横向和纵向都很好用:

UIViewController *content = [[SetTimeClockTimeViewController alloc] init];
popover = [[UIPopoverController alloc] initWithContentViewController:content];
[popover setDelegate:self];
UITableViewCell *cell = [dataTable cellForRowAtIndexPath:[dataTable indexPathForSelectedRow]];
[popover presentPopoverFromRect:cell.frame inView:cell.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

然而,当弹出窗口在弹出窗口保持向上时旋转时,弹出窗口会从单元格移开(如果我向后旋转,它会移动到正确的位置)。如果任一方向是起始方向,则会发生这种情况我尝试实施popoverController:willRepositionPopoverToRect:inView:,但我没有提出任何内容似乎解决了问题。例如:

- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view {
    // TODO: Popover moves wrong when rotating
    UITableViewCell *cell = [dataTable cellForRowAtIndexPath:[dataTable indexPathForSelectedRow]];
    *rect = cell.frame;
    *view = cell.superview;
}

我在转动时尝试将表格告诉reloadData,使用convertRect:toViewself.view作为视图,并在presentPopoverFromRect:inView:permittedArrowDirections:animated中调用didRotateFromInterfaceOrientation:,但似乎并没有解决不正确的安置问题。

如何确保旋转后从新单元格位置显示弹出窗口?

以纵向显示弹出窗口的示例(箭头指向“时间”行): Example of the popover displaying in portrait

定向到横向后(箭头应指向“时间”行): After orientation to landscape

3 个答案:

答案 0 :(得分:2)

从视图显示的弹出窗口不会与视图保持关系,并且可能更经常在旋转后转移到不正确的位置。这与从条形按钮项目显示不同,其中弹出框将在布局后移动。您应该将弹窗框移动到视图控制器的viewDidLayoutSubviews中的正确位置。

确保使用convertRect:toView:convertRect:fromView:将返回的矩形转换为视图的正确坐标系。

答案 1 :(得分:1)

您应该使用convertRect:toView将rect转换为superview。最重要的部分是用willAnimateToInterfaceOrientation方法调用它。

答案 2 :(得分:0)

我见过的最好的解决方案是使用单元格(或者在我的情况下是UIButton)作为sourceView,将单元格的边界用作sourceRect。 即。

[popover 
   presentPopoverFromRect:cell.bounds //vs cell.frame
   inView:cell                        //vs cell.superView
   permittedArrowDirections:UIPopoverArrowDirectionAny 
   animated:YES];