【问题标题】:How to add popovers for every cell in view collection in Swift如何在 Swift 中为视图集合中的每个单元格添加弹出框
【发布时间】:2018-10-20 13:06:51
【问题描述】:

我正在用文字编写一个应用程序(一种游戏)。所以,我有 CollectionView 的 WordsVC(每个单元格都是一个单词)。当长按单词(单元格)时,我想在单元格旁边显示带有翻译的弹出框。

但我无法将 segue 添加到单元格(Xcode 给我一个错误,有点“无法编译”)。 所以,我从CollectionView 转到 TraslationVC(popover)。这就是问题,因为弹出窗口会在视图集合的左上角弹出(我需要在点击的单元格旁边)。

通过搜索,我无法很好地回答。我能做些什么来实现它?

这里有一些代码:

WordsVC 中的 segue 准备:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // for another segue
    if segue.identifier == "fromWordsToWin" {
        if let wvc = sender as? WordsViewController {
            if let winVC = segue.destination as? WinningViewController {
                winVC.completedLevel = wvc.currentLevel
                winVC.levelsCount = wvc.dataSource.count()
                winVC.resultTime = wvc.result
            }
        }
    }
    // here
    if segue.identifier == "translationSegue" {
        if let cell = sender as? WordCell {
            if let tvc = segue.destination as? TranslationViewController {
                tvc.text = cell.myLabel.text ?? "empty cell"
                if let ppc = tvc.popoverPresentationController {
                    ppc.delegate = self
                }

            }
        }
    }
}

在 WordsVC 中设置非模态样式:

 func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.none
}

Segueing(来自 WordsVC):

@objc func longTap(_ sender: UIGestureRecognizer) {
    print("long tap happend")
    if let cell = sender.view as? WordCell {
        performSegue(withIdentifier: "translationSegue", sender: cell)
    }

并在 TranslatingVC 中设置弹出框的大小:

 override var preferredContentSize: CGSize {
    get {
        if textView != nil && presentingViewController != nil {
            return textView.sizeThatFits(presentingViewController!.view.bounds.size)
        } else {
            return super.preferredContentSize
        }
    }
    set { super.preferredContentSize = newValue}
}

如何做到这一点?

【问题讨论】:

  • 顺便说一句,我是 swift 的新手。并且应用程序基本上可以在 iPhone 上运行(不是 iPad)
  • 您可以尝试使用 popoverViewController 的 sourceView 属性,如 popoverVc.sourceView = cell.myLabel 并检查吗?
  • @Ashish,我的 popover VC 是“class TranslationViewController: UIViewController, UIPopoverPresentationControllerDelegate”。所以我找不到 .sourceView 属性。
  • @Ashish 所以,我误解了你。尝试找到UIVC.sourceView,但必须使用popoverVC.sourceView。是的。这样可行!谢谢你。实际上弹出框不在我需要的确切位置(它与按下的单词重叠,我需要它在旁边)。试图修复它
  • 您可以在其上使用另一个属性,就像它在您设置 .left、.right、.top 和 .bottom 的位置具有锚点方向一样。也许它的 arrowDirection 所以 pooverVC.arrowDirection 不确定属性名称,但你明白了

标签: ios swift uicollectionview uipopovercontroller uipopoverpresentationcontroller


【解决方案1】:

有人建议我使用 popoverViewController.sourceView。所以,它运作良好!我还添加了一些我的弹出框的确切位置设置。我在 prepareForSegue 下面的代码(代码中的最后 2 行):

 if segue.identifier == "translationSegue" {
        if let cell = sender as? WordCell {
            if let tvc = segue.destination as? TranslationViewController {
                tvc.text = cell.myLabel.text ?? "empty cell"
                if let ppc = tvc.popoverPresentationController {
                    ppc.delegate = self
                    ppc.sourceView = cell
                    ppc.sourceRect = CGRect(x: cell.bounds.minX + cell.bounds.width / 5, y: cell.bounds.minY, width: 50, height: 50 )
                }

            }
        }
    }

screenshot, how it looks like now

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2019-08-18
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多