首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS 8- UIPopoverPresentationController移动弹出窗口

iOS 8- UIPopoverPresentationController移动弹出窗口
EN

Stack Overflow用户
提问于 2014-06-28 00:52:59
回答 6查看 11.4K关注 0票数 20

我正在寻找一种有效的方法来使用新的uipopoverpresentationcontroller控制器来重新定位popover。我已经成功地展示了popover,现在我想移动它,而不是忽略和再次展示。我在使用这个函数时遇到了问题:

代码语言:javascript
复制
(void)popoverPresentationController:(UIPopoverPresentationController *)popoverPresentationController
      willRepositionPopoverToRect:(inout CGRect *)rect
                           inView:(inout UIView **)view

我知道这是游戏的早期阶段,但是任何人都有一个如何有效地做到这一点的例子,如果你能与我分享,我将不胜感激。提前谢谢。

EN

回答 6

Stack Overflow用户

发布于 2014-09-30 20:43:51

不幸的是,这个老生常谈的解决方案是我找到的唯一解决方案:

代码语言:javascript
复制
[vc.popoverPresentationController setSourceRect:newSourceRect];
[vc setPreferredContentSize:CGRectInset(vc.view.frame, -0.01, 0.0).size];

这会临时更改所显示视图的内容大小,导致弹出窗口和箭头被重新定位。大小的临时更改不可见。

这似乎是苹果需要解决的问题-当UIPopoverPresentationController已经呈现弹出窗口时,更改sourceViewsourceRect属性什么也不做(没有这个解决方法)。

希望这也适用于你!

票数 16
EN

Stack Overflow用户

发布于 2018-08-16 02:41:46

在更改了containerView?.setNeedsLayout()sourceRect之后,我有幸使用了popoverPresentationControllercontainerView?.layoutIfNeeded(),如下所示:

代码语言:javascript
复制
func movePopoverTo(_ newRect: CGRect) {
    let popover = self.presentedViewController as? MyPopoverViewController {
        popover.popoverPresentationController?.sourceRect = newRect
        popover.popoverPresentationController?.containerView?.setNeedsLayout()
        popover.popoverPresentationController?.containerView?.layoutIfNeeded()
    }
}

甚至可以让popover跟随tableView单元格,而无需更改任何内容:

代码语言:javascript
复制
class MyTableViewController: UITableViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "MyPopoverSegue" {
            guard let controller = segue.destination as? MyPopoverViewController else { fatalError("Expected destination controller to be a 'MyPopoverViewController'!") }
            guard let popoverPresentationController = controller.popoverPresentationController else { fatalError("No popoverPresentationController!") }
            guard let rowIndexPath = sender as? IndexPath else { fatalError("Expected sender to be an 'IndexPath'!") }
            guard myData.count > rowIndexPath.row else { fatalError("Index (\(rowIndexPath.row)) Out Of Bounds for array (count: \(myData.count))!") }
            if self.presentedViewController is MyPopoverViewController {
                self.presentedViewController?.dismiss(animated: false)
            }
            popoverPresentationController.sourceView = self.tableView
            popoverPresentationController.sourceRect = self.tableView.rectForRow(at: rowIndexPath)
            popoverPresentationController.passthroughViews = [self.tableView]
            controller.configure(myData[rowIndexPath.row])
        }
        super.prepare(for: segue, sender: sender)
    }
}

// MARK: - UIScrollViewDelegate

extension MyTableViewController {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if let popover = self.presentedViewController as? MyPopoverViewController {
            popover.popoverPresentationController?.containerView?.setNeedsLayout()
            popover.popoverPresentationController?.containerView?.layoutIfNeeded()
        }
    }
}
票数 8
EN

Stack Overflow用户

发布于 2015-11-11 03:57:55

我使用了与@Rowan_Jones在另一个答案中提到的相同的方法,但是我不希望popover的大小实际改变。即使是一个点的零头。我意识到可以多次将preferredContentSize设置为背靠背,但从视觉上看,它的大小只会更改以匹配上一个值。

代码语言:javascript
复制
[vc.popoverPresentationController setSourceRect:newSourceRect];
CGSize finalDesiredSize = CGSizeMake(320, 480);
CGSize tempSize = CGSizeMake(finalDesiredSize.width, finalDesiredSize.height + 1);
[vc setPreferredContentSize:tempSize];
[vc setPreferredContentSize:finalDesiredSize];

因此,即使finalDesiredSize与您的初始preferredContentSize相同,这也会导致弹出窗口被更新,即使它的大小实际上并没有改变。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24457063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档