当我调整它的大小时 UIPopoverController 移动

Posted

技术标签:

【中文标题】当我调整它的大小时 UIPopoverController 移动【英文标题】:UIPopoverController moves when I resize it 【发布时间】:2013-09-28 06:51:18 【问题描述】:

我有一个使用了一段时间的 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];


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

【问题讨论】:

【参考方案1】:

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

创建弹出框
permittedArrowDirections = UIPopoverArrowDirectionAny

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

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

希望这会有所帮助。

【讨论】:

不幸的是,这不是一个完美的解决方案,因为很多应用程序(包括我的)需要从屏幕上的任何位置呈现弹出框。 然后写一些代码重新计算位置,并根据位置选择箭头方向,只是不要让iOS自己决定,如果你想稍后调整弹出框的大小。【参考方案2】:

当弹出框可见并且你想改变它的大小时,你应该使用:

-[UIPopover setPopoverContentSize:animated:]

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

【讨论】:

【参考方案3】:

乍一看,您的代码看起来不错。我没用过beginAnimations:context:,所以我查了UIView documentation,里面有这个评论:

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

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

【讨论】:

【参考方案4】:

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

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

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

Apple documentation saying popoverArrowDirection is deprecated in iOS7 - “弹出框在 iOS 7 及更高版本中不使用箭头。”

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

【讨论】:

【参考方案5】:

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

来自Apple's documentation:

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

【讨论】:

经过几次测试,我可以确认您提到的委托只是在界面轮换期间被调用,这与描述的场景不同。

以上是关于当我调整它的大小时 UIPopoverController 移动的主要内容,如果未能解决你的问题,请参考以下文章

调整大小时如何调整子节点的大小以适合 SKSpriteNode 的大小?

HTML时钟自动调整大小保持比例

JavaScript:如何调整div.card的大小

UITableViewController 未根据输入调整大小

调整 UINavigationController 的大小?

推送视图控制器后视图调整大小