UIPopoverController在我调整大小时移动

时间:2013-09-28 06:51:18

标签: ios ios7 uipopovercontroller

我有一个UIPopoverController我已经使用了一段时间。我现在正在为iOS 7更新我的代码,当我调整popover的大小时,它突然在屏幕上移动,这会导致非常糟糕的用户体验。

当我处于纵向时,它不会发生。我点击打开弹出窗口,然后点击按钮,弹出窗口,一切都很好。但是,如果我切换到横向并做同样的事情,当我点击按钮展开弹出框时,它会滑到另一个位置。

以下是一段视频,展示了我所说的内容:https://vimeo.com/75632364

当用户点击导致弹出窗口大小调整的按钮时运行的代码:

- (IBAction) touchedButtonPayDownLoan:(id)sender {

    UIView *payOffView = nil;
    if ([self.liability isBankLoan]) {
        payOffView = self.viewPayoffBank;
    } else {
        payOffView = self.viewPayoffOther;
    }

    CGRect loanFrame = payOffView.frame;
    loanFrame.origin.y = self.toolbar.frame.origin.y;
    payOffView.frame = loanFrame;
    [self.view addSubview:payOffView];
    [self.view bringSubviewToFront:self.toolbar];

    [UIView beginAnimations:@"Show Payoff View" context:nil];

    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    [items removeLastObject];
    [items addObject:self.barButtonFinish];
    self.toolbar.items = items;

    // -------- RELEVANT BITS HERE ---------
    CGRect frame = self.view.frame;
    frame.size.height += payOffView.frame.size.height;
    self.view.frame = frame;
    self.preferredContentSize = frame.size;
    // -------- RELEVANT BITS HERE ---------

    [UIView commitAnimations];

}

我不希望弹出窗口跳转位置,因为这会惹恼用户。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

我遇到了类似的问题,我发现弹出窗口的移动是由于布局管理器认为新尺寸的弹出窗口不适合最后位置,或者看起来更好一个 - 你最有可能用

创建popover
permittedArrowDirections = UIPopoverArrowDirectionAny

令人困惑的是,虽然弹出窗口移动到新位置,但箭头不会重新绘制。

在我结束时,我通过将allowedArrowDirections显式设置为一个值(UP或DOWN)来解决问题,并且调整大小不再使我的popover移动。

希望这有帮助。

答案 1 :(得分:1)

当弹出窗口可见并且您想要更改其大小时,您应该使用:

-[UIPopover setPopoverContentSize:animated:]

您不应直接更改控制器的frame

答案 2 :(得分:0)

乍一看,您的代码看起来很好。我没有使用beginAnimations:context:,所以我检查了UIView documentation,它包含了这条评论:

  

在iOS 4.0及更高版本中不鼓励使用此方法。你应该用   基于块的动画方法来指定你的动画。

因此,我建议您更改代码以使用基于块的动画方法,例如: animateWithDuration:animations:并查看您的弹出窗口是否仍然意外移动。

答案 3 :(得分:0)

感谢@PeterSarnowski的回答,我能够阻止我的popover在iOS7中移动:

[myPopoverController presentPopoverFromRect:view.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO];

我想知道这种解决方法是否必要,因为Apple考虑改变iOS7中的弹出行为(可能仍然是?):

但显然目前的文件不准确。 iOS 7 - UIPopoverController : deprecated arrows?

答案 4 :(得分:0)

您应该在iOS 7中查看UIPopoverControllerDelegate的新popoverController:willRepositionPopoverToRect:inView:方法。您可以在那里调整UIPopover的位置。

来自Apple's documentation

  

对于使用presentPopoverFromRect:inView:allowedArrowDirections:animated:方法呈现的弹出框,当界面方向更改时,弹出控制器会调用此方法。您的代理人可以使用此方法调整弹出窗口的建议位置。