android qavgesture,新的UIView阻止UITapGesture

我有一个视频在我的scrollView的每个页面的背景启用分页。我希望视频在可以看到视频的区域被轻拍时播放/暂停(请参阅左下图,UIView包含名称和图像标签与底部标签栏之间的图片)(视频子视图中有另一个子视图,每页:顶部信息)。用来实现的代码是循环以下(for循环,因为每一页应具有这些属性):新的UIView阻止UITapGesture

//add subviews (pages)

for (pageIndex, page) in pagesViews.enumerated(){

//...create pages with views

//add Subview with videoplayer frame to individual "pages"

let videoPlayerFrame = CGRect(x: 0, y: 0, width: pageSize.width, height: pageSize.height)

let videoPlayerView = PlayerView(frame: videoPlayerFrame)

page.addSubview(videoPlayerView)

//add Subview with top info frame to individual "pages"

let postInfoFrame = CGRect(x: 0, y: 0, width: pageSize.width, height: 80)

let infoView = PostView(frame: postInfoFrame)

page.addSubview(infoView)

//WORKS FINE UNTIL HERE

//NEW SUBVIEW

//add Subview with bottom info frame to individual "pages"

let postPropertiesFrame = CGRect(x: 0, y: (pageSize.height - 200)/2, width: pageSize.width, height: 200)

let propertiesView = PostPropsView(frame: postPropertiesFrame)

page.addSubview(propertiesView)

}

那是什么样子,如果新的子视图尚未添加:b1048a3651360151de7acc102df73893.png

PlayerView类作为第一子视图的基础上,视频播放/暂停,当我点击视频区域(阅读评论,从而更好概述第一(例如微调应该并不重要)):

lass PlayerView: UIView {

//create spinner view

let activityIndicatorView: UIActivityIndicatorView = {

//define properties

let aiv = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)

aiv.translatesAutoresizingMaskIntoConstraints = false

//start spinner

aiv.startAnimating()

return aiv

}()

//create controls container view containing the spinner

let controlsContainerView: UIView = {

//set properties of controls container view

let controlView = UIView()

controlView.backgroundColor = UIColor(white: 0, alpha: 1)

return controlView

}()

override init(frame: CGRect){

super.init(frame: frame)

//function below this override init

setupPlayerView()

//add subview with controls (e.g. spinner)

controlsContainerView.frame = frame

addSubview(controlsContainerView)

//add to subview and center spinner in subview

controlsContainerView.addSubview(activityIndicatorView)

activityIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true

activityIndicatorView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

//enable interaction

controlsContainerView.isUserInteractionEnabled = true

//function below this override init

defInteractions()

//backgorund color of player

backgroundColor = .black

}

//define interactions (doupletap and singletap)

func defInteractions(){

//singletap

let singleTap = UITapGestureRecognizer(target: self, action: #selector(singleTapDetected(_:)))

singleTap.numberOfTapsRequired = 1

//controlsContainerView

controlsContainerView.addGestureRecognizer(singleTap)

}

//define type

var player: AVPlayer?

//set playing to false

var isPlaying: Bool = false

//PLAY?PAUSE VIDEO WHEN video tapped

func singleTapDetected(_ sender: UITapGestureRecognizer) {

//play or pause

if(!isPlaying){

//play

player?.play()

isPlaying = true

}

else{

//pause

player?.pause()

isPlaying = false

}

}

//setup video in background

func setupPlayerView() {

//insert url

let urlString = "https://blurtime.com/images/testvideo.mov"

//check URL if can be converted to NSURL

if let videoURL = NSURL(string: urlString){

//player's video

if self.player == nil {

player = AVPlayer(url: videoURL as URL)

}

//add sub-layer

let playerLayer = AVPlayerLayer(player: player)

self.layer.addSublayer(playerLayer)

playerLayer.frame = self.frame

//when are frames actually rendered (when is video loaded)

player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

//loop through video

NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { (_) in

DispatchQueue.main.async {

self.player?.seek(to: kCMTimeZero)

self.player?.play()

}

})

}

}

//what to do when video is loaded (spinner shall disappear)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

//when frames are actually being rendered

if keyPath == "currentItem.loadedTimeRanges" {

activityIndicatorView.stopAnimating()

controlsContainerView.backgroundColor = .clear

}

}

//reuired as suggested by XCode

required init?(coder aDecoder: NSCoder) {

fatalError("init(coder:) has not been implemented")

}

}

不过,如果我添加与的子视图类它不完全工作了。如果黄色区域被点击,它仍然可以按照需要运行,但不会再在红色区域运行......(右侧图片)为什么它会在较低的黄色区域运行,并且为什么红色区域没有运行?任何人都可以为这个问题提供一个解决方案(和解释)吗?

2017-05-30

Moritz

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值