Как добавить всплывающие окна для каждой ячейки в коллекции представлений в Swift - PullRequest
0 голосов
/ 20 октября 2018

Я пишу приложение (вид игры) со словами.Итак, у меня есть WordsVC с CollectionView (где каждая ячейка является словом).И когда слово (ячейка) долго нажимается, я хочу показать поповер с переводом рядом с ячейкой.

Но я не могу добавить segue в ячейку (Xcode выдает ошибку, что-то вроде «не могу скомпилировать»).Итак, я переключаюсь с CollectionView на TraslationVC (popover).И это проблема, потому что всплывающее окно выскакивает в левом верхнем углу представления коллекции (мне нужно рядом с повернутой ячейкой).

Я не мог точно ответить, выполнив поиск.Что я могу сделать, чтобы достичь этого?

Вот код:

Подготовка к переходу в WordsVC:

 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 (fromWordsVC):

@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}
}

Как это сделать?

1 Ответ

0 голосов
/ 20 октября 2018

Мне посоветовали использовать 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 )
                }

            }
        }
    }

снимок экрана, как это выглядит сейчас

...