【问题标题】:AVPlayerViewController in uicollectionviewcell - cancel touchuicollectionviewcell 中的 AVPlayerViewController - 取消触摸
【发布时间】:2015-08-14 07:12:29
【问题描述】:

我有一个 AVPlayerViewControllerin 和自定义 uicollectionviewcell

当从 AVPLayerViewController 触摸 AVPlayer 时,如何禁用对 didSelectItemAtIndexPath 的调用?

单元格上有很多其他元素,应该会触发didSelectItemAtIndexPath

实际上在播放器控件上它可以工作,但是一旦它们淡出,再次触摸 avplayer 就会触发 didselect。

在同一个单元格中有一个 uibutton,可以正确取消触摸。

【问题讨论】:

  • 为什么要禁用通话?当它调用时,你可以什么都不做。如果它调用 didSelectItemAtIndexPath 会发生什么?
  • 我希望能够使用 AVPlayerViewcontroller,例如单击应该显示播放器控件,而不是从 collectionview 触发“didSelect”
  • 意思是,点击collectionview什么都不做?您可以通过 cell.userInteractionEnabled = NO; 禁用交互单元格;不确定这是你想要的
  • 我基本上想要打开用户交互——点击其他任何地方都应该触发 didSelect,期望在点击 AVPlayerViewController 时
  • 所以,当你触摸一个单元格时,它会调用 didSelectItemAtIndexPath,而 AVPLayerViewController 没有得到触摸。或者 cel 和 player 都被调用了?

标签: ios objective-c uicollectionviewcell avplayer avplayerviewcontroller


【解决方案1】:

一个 hacky 解决方案是覆盖您单元格的 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)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2015-04-21
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多