调整UIPopoverController的行为大小因iOS 7.0和iOS 7.1而异

时间:2014-03-28 10:40:10

标签: uitableview uiscrollview uinavigationcontroller uipopovercontroller ios7.1

我有一个UIPopoverController,它在UINavigationController中包含一个UITableViewController。 每当按下此表视图中的单元格时,我将另一个UITableViewController推送到我的导航控制器。

我想设置第二个表格视图的高度(假设为200)并相应地调整弹出窗口的大小。

因此,我首先在viewDidAppear:(BOOL)animated中设置表格视图框,然后调用setPopoverContentSize:(CGSize)size animated:(BOOL)animated。两个高度都设置为200。

调整大小有效,但不同的iOS版本存在以下差异:

iOS 6.1

  • 按预期:调整大小的弹出窗口的高度为200 +导航栏的高度。

iOS 7.0

  • 不按预期:调整大小的弹出窗口的高度为200,包括导航栏的高度。

iOS 7.1

  • 按预期:调整大小的弹出窗口的高度为200 +导航栏的高度。
  • 由于某种原因,调整大小是动画的,表视图会很快显示在导航栏后面。

我可以忍受不同的高度,因为这些可以根据iOS版本进行调整。不过,我不喜欢丑陋的动画。你知道如何在没有这个小故障的情况下实现我的目标吗?

以下是我想要避免的效果的屏幕截图:

enter image description here

在这里,我如何创建UIPopoverController:

- (IBAction)showPopup:(id)sender
{
    MyTableViewController *table = [[MyTableViewController alloc] initWithStyle:UITableViewStylePlain];

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:table];
    nav.navigationBar.tintColor = [UIColor orangeColor];

    UIPopoverController *pop = [[UIPopoverController alloc] initWithContentViewController:nav];

    table.parentPopover = pop;

    UIView *origin = (UIView *)sender;
    CGRect buttonRect = CGRectMake(origin.frame.origin.x, origin.frame.origin.y, origin.frame.size.width, origin.frame.size.height);
    [pop presentPopoverFromRect:buttonRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

按下表格单元格时,我会推送另一个表格视图控制器:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

    MyNextTableViewController *next = [[MyNextTableViewController alloc] initWithStyle:UITableViewStylePlain];
    next.parentPopover = self.parentPopover;
    [self.navigationController pushViewController:next animated:YES];
}

这就是我要做的事情来调整“#final”的结果。表格视图和弹出窗口:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.tableView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 200);
    [self.parentPopover setPopoverContentSize:[self contentSizeForViewInPopover] animated:NO];
}

- (CGSize)contentSizeForViewInPopover
{
    return CGSizeMake(320, self.tableView.frame.size.height);
}

顺便说一下,我知道从iOS 7.0开始不推荐- (CGSize)contentSizeForViewInPopover,但我想支持iOS 6,使用- (CGSize)preferredContentSize时也会出现上述问题。与UIScrollView相同的问题,不仅仅是UITableView。

编辑: 我向Apple提交了一个错误报告,错误号为16865330。

1 个答案:

答案 0 :(得分:4)

这是iOS7及更高版本中弹出控制器的错误。请在https://bugreport.apple.com中与Apple打开错误报告,并在您的问题中发布错误编号。

由于调整viewDidAppear中的弹出控制器的大小,会发生这种情况。关键是要稍微延迟调整大小,以便弹出控制器可以完成其布局。在主队列上使用dispatch_async,您可以注册您的块以在主runloop的后续传递上运行,这使得popover控制器有足够的时间来繁殖"繁殖"并且不会再现错误。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.tableView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 200);

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.parentPopover setPopoverContentSize:[self contentSizeForViewInPopover] animated:NO];
    });
}