我有一个从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:toView
将self.view
作为视图,并在presentPopoverFromRect:inView:permittedArrowDirections:animated
中调用didRotateFromInterfaceOrientation:
,但似乎并没有解决不正确的安置问题。
如何确保旋转后从新单元格位置显示弹出窗口?
以纵向显示弹出窗口的示例(箭头指向“时间”行):
定向到横向后(箭头应指向“时间”行):
答案 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];