AVPlayerViewController в uicollectionviewcell — отменить касание

у меня есть AVPlayerViewControllerin и пользовательская ячейка uicollectionviewcell

как я могу отключить вызов didSelectItemAtIndexPath при прикосновении к AVPlayer из AVPLayerViewController?

в ячейке есть куча других элементов, которые должны вызывать didSelectItemAtIndexPath

на самом деле на элементах управления плеером это работает, но как только они исчезают, еще одно прикосновение к avplayer запускает didselect.

наличие uibutton в той же ячейке корректно отменяет касания.


person Helmut Januschka    schedule 14.08.2015    source источник
comment
Почему вы хотите отключить звонки? Вы можете просто ничего не делать, когда он звонит. Что произойдет, если он вызовет didSelectItemAtIndexPath?   -  person tuledev    schedule 14.08.2015
comment
я хочу иметь возможность использовать AVPlayerViewcontroller, например, одно касание должно отображать элементы управления плеером, а не запускать didSelect из представления коллекции   -  person Helmut Januschka    schedule 14.08.2015
comment
Это значит, что тап на просмотр коллекции ничего не даст? Вы можете отключить ячейку взаимодействия с помощью cell.userInteractionEnabled = NO; Не уверен, что это то, что вы хотите   -  person tuledev    schedule 14.08.2015
comment
я в основном хочу, чтобы взаимодействие с пользователем было включено - и нажатие в любом другом месте должно вызывать didSelect, ожидайте при нажатии на AVPlayerViewController   -  person Helmut Januschka    schedule 14.08.2015
comment
Таким образом, когда вы касаетесь ячейки, она вызывает didSelectItemAtIndexPath, а AVPLayerViewController не получает касания. Или и чел и плеер называются?   -  person tuledev    schedule 14.08.2015
comment
правильно! сама ячейка получает касания независимо от того, нажмете ли вы avplayer или нет   -  person Helmut Januschka    schedule 14.08.2015
comment
Что произойдет, если ячейка получит прикосновения? игрок не может получить касания? Или ячейка выделена?   -  person tuledev    schedule 14.08.2015


Ответы (1)


Одним из хакерских решений является переопределение hitTest вашей ячейки и отмена выбора при нажатии на представление игрока:

class MyCell : UITableViewCell {
    @IBOutlet private weak var videoContainer:UIView!

    override func awakeFromNib() {
        super.awakeFromNib()

        // Settings up the video inside the cell :

        let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")!
        let player = AVPlayer(url: videoURL)
        playerViewController = AVPlayerViewController()
        playerViewController.player = player
        player.play()

        videoContainer.addSubview(playerViewController.view)
        playerViewController.view.pinEdgesToSuperviewEdges()
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let convertedPoint = videoContainer.convert(point, from: self)
        if let hitView = videoContainer.hitTest(convertedPoint, with: event) {
            // The tap is somewhere inside the video view, 
            // disable user interaction on the cell and continue
            self.isUserInteractionEnabled = false
            return hitView
        }
        else {
            // Tap is outside the video, 
            // use behavior that will trigger `didSelectItemAtIndexPath`
            self.isUserInteractionEnabled = true
            return super.hitTest(point, with: event)
        }
    }
}
person Axel Guilmin    schedule 29.08.2019