如何为 Swift 中视图集合中的每个单元格添加弹出窗口
How to add popovers for every cell in view collection in Swift
我正在用文字编写一个应用程序(一种游戏)。所以,我有带 CollectionView
的 WordsVC(其中每个单元格都是一个词)。当长按单词(单元格)时,我想在单元格旁边显示带有翻译的弹出窗口。
但是我无法将 segue 添加到单元格(Xcode 给我一个错误,类似于 "can't compile")。
所以,我正在从 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}
}
如何操作?
有人建议我使用 popoverViewController.sourceView。所以,它运作良好!我还添加了一些关于弹出窗口确切位置的设置。我在下面的 prepareForSegue 中的代码(代码中的最后两行):
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
我正在用文字编写一个应用程序(一种游戏)。所以,我有带 CollectionView
的 WordsVC(其中每个单元格都是一个词)。当长按单词(单元格)时,我想在单元格旁边显示带有翻译的弹出窗口。
但是我无法将 segue 添加到单元格(Xcode 给我一个错误,类似于 "can't compile")。
所以,我正在从 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}
}
如何操作?
有人建议我使用 popoverViewController.sourceView。所以,它运作良好!我还添加了一些关于弹出窗口确切位置的设置。我在下面的 prepareForSegue 中的代码(代码中的最后两行):
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