UIPopoverController的大小改变时会移动

4
我有一个UIPopoverController已经使用了一段时间。现在我正在更新我的iOS7代码,当我调整弹出窗口的大小时,它突然移动到屏幕的另一侧,这会给用户带来非常糟糕的体验。
当我处于竖直方向时,不会发生这种情况。我点击以打开弹出视图,然后点击按钮使弹出视图扩展,一切正常。但是,如果我切换到横向方向并执行相同的操作,则在我点击按钮扩展弹出视图后,它会滑动到另一个位置。
这里是一个视频展示了我说的问题: 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个回答

4

我遇到了类似的问题,我发现弹出框移动的原因是布局管理器认为新大小的弹出框不适合最后一个位置,或者在新位置上看起来更好 - 你很可能使用了

permittedArrowDirections = UIPopoverArrowDirectionAny

令人困惑的是,虽然弹出框移动到了新位置,但箭头没有重新绘制。

在我的端上,我通过明确设置permittedArrowDirections为一个值(UP或DOWN),调整大小不再使我的弹出框四处移动。

希望这可以帮助。


不幸的是,这并不是一个完美的解决方案,因为很多应用程序(包括我的)需要从屏幕的任何位置呈现弹出窗口。 - Bek
然后只需编写一些代码来重新计算位置,并根据位置选择箭头方向,只是不要让iOS自己决定,如果您以后想调整弹出窗口的大小。 - Peter Sarnowski

1
当弹出窗口可见时,如果您想要更改其大小,应该使用:-[UIPopover setPopoverContentSize:animated:]。不应直接更改控制器的frame

0

感谢@PeterSarnowski的答案,我成功阻止了我的iOS7中的弹出窗口移动:

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

我想知道这个解决方法是否必要,因为苹果公司曾经(或者现在仍然)考虑在iOS7中改变弹出窗口的行为:

但显然,目前该文档并不准确。iOS 7 - UIPopoverController : deprecated arrows?


0

乍一看,您的代码看起来很好。我没有使用beginAnimations:context:,所以我查看了UIView文档,其中包括以下评论:

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

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


0
你应该看一下iOS 7中UIPopoverControllerDelegate的新方法popoverController:willRepositionPopoverToRect:inView:。你可以在这里调整UIPopover的位置。
来自Apple的文档

对于使用presentPopoverFromRect:inView:permittedArrowDirections:animated:方法呈现的弹出视图,当界面方向发生改变时,弹出视图控制器会调用此方法。你的代理可以使用此方法来调整弹出视图的预期位置。


经过几次测试,我可以确认你提到的代理只在界面旋转期间被调用,这与所描述的情况不同。 - Omer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接