- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个videPlayerView,它上面有ContainerView来显示activityIndicatorView。当我从单元格内的 collectionView 中选择一个项目时, View 就会被加载。我的问题是如何使用cancelButton删除此 View ,我尝试了容器和playerView的removeFromSuperview()
,但应用程序因此错误而崩溃
AQDefaultDevice (1): skipping input stream 0 0 0x0
代码如下:
class VideoPlayerView: UIView {
var videoUrl: String!
var uuidd: String!
let activityIndicatorView: UIActivityIndicatorView = {
let aiv = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
aiv.translatesAutoresizingMaskIntoConstraints = false
aiv.startAnimating()
return aiv
}()
lazy var controlsContainerView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(white: 0, alpha: 1)
view.isUserInteractionEnabled = true
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handlezoomout)))
return view
}()
func handlezoomout(hh: UITapGestureRecognizer){
print("n3me")
}
lazy var cancelButton: UIButton = {
let cancelButton = UIButton()
cancelButton.setImage(#imageLiteral(resourceName: "cancel"), for: UIControlState())
cancelButton.addTarget(self, action: #selector(cancel), for: .touchUpInside)
return cancelButton
}()
func cancel() {
controlsContainerView.removeFromSuperview()
let video = VideoPlayerView()
video.removeFromSuperview()
}
lazy var pausePlayButton: UIButton = {
let button = UIButton(type: .system)
let image = UIImage(named: "pause")
button.setImage(image, for: UIControlState())
button.translatesAutoresizingMaskIntoConstraints = false
button.tintColor = .white
button.isHidden = true
button.addTarget(self, action: #selector(handlePause), for: .touchUpInside)
return button
}()
var isPlaying = false
func handlePause() {
if isPlaying {
player?.pause()
pausePlayButton.setImage(UIImage(named: "play"), for: UIControlState())
} else {
player?.play()
pausePlayButton.setImage(UIImage(named: "pause"), for: UIControlState())
}
isPlaying = !isPlaying
}
override init(frame: CGRect) {
super.init(frame: frame)
setUpPlayerView()
controlsContainerView.frame = frame
addSubview(controlsContainerView)
cancelButton.frame = CGRect(x: 16.0, y: 20.0, width: 30.0, height: 30.0)
controlsContainerView.addSubview(cancelButton)
controlsContainerView.addSubview(activityIndicatorView)
activityIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
activityIndicatorView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
controlsContainerView.addSubview(pausePlayButton)
pausePlayButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
pausePlayButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
pausePlayButton.widthAnchor.constraint(equalToConstant: 50).isActive = true
pausePlayButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
backgroundColor = UIColor.black
}
var player: AVPlayer?
fileprivate func setUpPlayerView() {
let postQuery = PFQuery(className: "posts")
postQuery.whereKey("uuid", equalTo: PostUuidGlobalVariable.postuuid.last!)
postQuery.getFirstObjectInBackground { (object, error) in
if (error == nil && object != nil) {
let videoFile = object!["video"] as! PFFile
if let url = URL (string: videoFile.url!) {
self.player = AVPlayer(url: url)
let playerLayer = AVPlayerLayer(player: self.player)
self.layer.addSublayer(playerLayer)
playerLayer.frame = self.frame
self.player?.play()
self.player?.isMuted = false
self.player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(note:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem)
}
}
}
}
func playerDidFinishPlaying(note: NSNotification) {
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
//this is when the player is ready and rendering frames
if keyPath == "currentItem.loadedTimeRanges" {
activityIndicatorView.stopAnimating()
pausePlayButton.isHidden = false
isPlaying = true
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class VideoLauncher: NSObject {
func showVideoPlayer() {
if let keyWindow = UIApplication.shared.keyWindow {
let view = UIView(frame: keyWindow.frame)
view.isUserInteractionEnabled = true
view.backgroundColor = UIColor.white
view.frame = CGRect(x: keyWindow.frame.width - 10, y: keyWindow.frame.height - 10, width: 10, height: 10)
let height = keyWindow.frame.height
let videoPlayerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: height)
let videoPlayerView = VideoPlayerView(frame: videoPlayerFrame)
view.addSubview(videoPlayerView)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
view.frame = keyWindow.frame
}, completion: { (completedAnimation) in
//maybe we'll do something here later...
UIApplication.shared.isStatusBarHidden = true
})
keyWindow.addSubview(view)
}
}
}
最佳答案
这有可能与您在主线程之外更改用户界面有关。
来自 UIView 文档
'线程注意事项
对应用程序用户界面的操作必须发生在主线程上。因此,您应该始终调用用户界面 View 类来自在应用程序主线程中运行的代码。唯一可能不是严格必要的情况是在创建 View 对象本身时,但所有其他操作都应在主线程上进行。'
此外,您的取消函数会创建一个新的视频播放器 View ,然后尝试将其从其父级中删除,这看起来不正确。
您的取消回调可能应如下所示
func cancel() {
DispatchQueue.main.async { [unowned self] in
// to remove controls
self.controlsContainerView.removeFromSuperview()
// to remove video player view
self.view.removeFromSuperview()
}
}
关于swift - 如何从 superView 中删除自定义的playerView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45260484/
我想为我的 UILabel 实现与 iOS 7 的新 iTunes 远程更新相同的效果。 如果您查看此屏幕: (右边的那个)你会注意到 UILabel 文本颜色是背景模糊的专辑封面,没有黑色 mask
这里有两个组件,UIView *superView 和 UILabel *label。 label 是 superView 的 subview 。问题是当我将标签移出其 super View 时,标签
我正在开发一个应用程序,其中我的所有 UIViewControllers 具有通用的 UITableView 结构。所以我创建了一个包含通用结构的 UITableView 子类,然后我将这个 View
我有一个简单的 iPad 应用程序,其中包含以下 View 层: BaseView(覆盖整个可用区域)。 SquareView(覆盖 100x100px 区域)。 SquareView 作为 subv
我正在查看 SnapKit 文档:http://snapkit.io/docs/ 如果您转到使用部分,它会显示以下示例代码: let box = UIView() superview.addSubv
我正在尝试向页面添加一个新的 subview ,这样除了它本身之外的所有内容都显示为灰色。但是,我是从屏幕的 subview 中调用它的。要将其取出,我必须执行以下操作: [self.view.sup
我正在开发一个小游戏,我想在 super View 上做一些功能.. super View 是一个自定义类,即 Reflection View..并希望在用户移动 View 时隐藏反射.. 这是我所做
ScrollView 有一些 SubViews.... ScrollView 包含它的预定义手势(Pan) 和我的自定义手势(Pan) 以及同时识别它... SubViews 还包含自定义 Pan G
我有一个videPlayerView,它上面有ContainerView来显示activityIndicatorView。当我从单元格内的 collectionView 中选择一个项目时, Vie
我有一个与其他子托管对象处于“对多”关系的托管对象。当我删除子管理对象之一时,主管理对象上表示与子管理对象关系的数组将被清空。 下面是我获取 subManaged 对象并将其删除时发生的情况的日志。我
基本上,我希望能够单击下图中的所有 subview ... 我希望能够点击 View B 的 subview ,但 View A 挡住了,即使 View A subview 没有阻挡下面的 View
我正在创建 UIView 的子类以在项目中使用,并将处理主视图上的触摸。我希望当拖动触摸(在主视图上)并接触特殊的 UIView 时,它们会更改其背景颜色。使用 UIView 的默认“touchesM
我在 UIView 中有一个 UIButton,有两个约束。这两个约束都是在 Interface Builder 中设置的,以便 UIButton 在其 super View 中垂直和水平居中。 我想
Collection View Cell 的子类化方式如下: 我在 Collection View 中有这个布局。在创建每个按钮时,我调用以下代码: [cell.imageButton add
我正在使用自动布局。我有一个 UIView,它位于距 super View 中心 20 像素的边距处。 现在我已经将顶部空间分配给了我在 iPhone 6+ Xib 中创建的 super View 。
这个问题在这里已经有了答案: Xcode 6 beta 7: storyboard adds extra space on right and left sides (1 个回答) 关闭 8 年前
我在屏幕上有一个从 XIB 加载的 subview ,我需要在其父 View 上禁用触摸事件ONLY,同时最终不触摸 subview 。我该怎么做?另外,我使用的是 iOS。 谢谢! 最佳答案 这就是
我有一个 UICollectionView,它使用 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 来确定用户何时滚动到底部。 我的 UI
我试图将点击事件传递给 super View ,但处理长按事件。我已将 LongPressGestureRecognizer 添加到顶 View ,但点击事件未传递到 super View 。我尝试了
我将 subview 添加到父 View ,我想约束 subview 。但它什么都不做。 subview 在父 View 上全屏添加。请帮助我,出了什么问题? 这是我的代码: override f
我是一名优秀的程序员,十分优秀!