4

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

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

这是一段视频,展示了我在说什么: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];

}

我不希望弹出框跳转位置,因为这会惹恼用户。有任何想法吗?

4

5 回答 5

4

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

permittedArrowDirections = UIPopoverArrowDirectionAny

令人困惑的是,尽管弹出框移动到新位置,但箭头并没有被重绘。

最后,我通过将 allowedArrowDirections 显式设置为一个值(UP 或 DOWN)解决了这个问题,并且调整大小不再使我的弹出框四处移动。

希望这可以帮助。

于 2013-10-09T09:31:39.330 回答
1

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

-[UIPopover setPopoverContentSize:animated:]

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

于 2013-09-28T13:22:16.440 回答
0

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

来自苹果的文档

对于使用 presentPopoverFromRect:inView:permittedArrowDirections:animated: 方法呈现的弹出框,弹出框控制器会在界面方向更改时调用此方法。您的委托可以使用此方法来调整弹出框的建议位置。

于 2013-12-07T03:42:34.313 回答
0

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

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

我想知道这种解决方法是否必要,因为 Apple 曾经(也许现在仍然是?)考虑改变 iOS7 中的弹出框行为:

但显然,目前该文件并不准确。iOS 7 - UIPopoverController:不推荐使用的箭头?

于 2013-10-30T18:26:31.020 回答
0

乍一看,您的代码看起来不错。我没有使用过beginAnimations:context:,所以我检查了UIView 文档,它包含以下评论:

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

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

于 2013-09-28T08:22:02.197 回答