我正在为tvOS编写一个应用程序,启动视频从网址的一个AVPlayerView,这不是嵌套在另一个视图。问题是,用户在加载时不知道发生了什么,所以我想在屏幕中央添加一个活动指示器。
然而,在加载视频时获取屏幕中心并不简单,因为在加载视频时视图的边界被设置为(0,0,0,0),所以设置子视图的center = view.center不起作用(它只会将我的子视图添加到屏幕的左上角)。
当框架设置为(0,0,0,0)时,如何将子视图添加到屏幕的中心?
发布于 2017-11-16 04:55:53
幸运的是,我能够自己找到答案。与在iOS设备上一样,UIScreen在tvOS上也能正常工作。下面是我的完整解决方案,希望它能帮你节省一些时间。我也包括我的观察者,它们也触发了结束。
我用来处理活动的类
class VideoLoadingActivityIndicator {
var loadingActivityIndicator:UIActivityIndicatorView!
var loadingLabel: UILabel!
func beginLoadingActivity(viewController:UIViewController)
{
loadingActivityIndicator = UIActivityIndicatorView(frame:CGRect(x: 500, y: 500, width: 500, height: 500)) as UIActivityIndicatorView
loadingActivityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge
loadingActivityIndicator.sizeToFit()
loadingActivityIndicator.color = UIColor.white这是使用UIScreen获取边界的部分
let screenBounds = UIScreen.main.bounds
let centerX = screenBounds.size.width / 2
let centerY = screenBounds.size.height / 2
let loadingLabelCenterY = centerY + 48
let activityIndicatorCenter = CGPoint(x: centerX, y: centerY)
loadingActivityIndicator.center = activityIndicatorCenter我添加了一个标签来增加一些清晰度。
loadingLabel = UILabel(frame: CGRect(x: centerX, y: loadingLabelCenterY, width: 600, height: 100))
loadingLabel.font = UIFont(name: "Helvetica", size: 30)
loadingLabel.text = "Loading Video"
loadingLabel.numberOfLines = 1
loadingLabel.sizeToFit()
loadingLabel.textAlignment = .center
// reset frame so it is centered in screen
let labelWidth = loadingLabel.frame.width
let labelHeight = loadingLabel.frame.height
let loadingLabelCenterX = centerX - (labelWidth / 2)
loadingLabel.frame = CGRect(x: loadingLabelCenterX, y: loadingLabelCenterY, width: labelWidth, height: labelHeight)
loadingLabel.textColor = UIColor.white
// Add indicator and label to subview
viewController.view.addSubview(loadingActivityIndicator)
viewController.view.addSubview(loadingLabel)
self.loadingActivityIndicator.startAnimating()
}
func endLoadingActivity(viewController:UIViewController)-> Void
{
loadingActivityIndicator.removeFromSuperview()
loadingLabel.removeFromSuperview()
}然后在您想要添加一些加载活动的AVPlayerViewController中...
首先创建活动指示器对象:
let indicator = VideoLoadingActivityIndicator()创建你的资源,和playerItem (我设置了一些播放器项目的关键点)
let asset = AVAsset(url: runFile)
let assetKeys = [
"playable",
"hasProtectedContent"
]
let playerItem = AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: assetKeys)启动活动指示器动画
indicator.beginLoadingActivity(viewController: self, color: .white)向播放器添加通知并开始播放
playerItem.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
player = AVPlayer(playerItem: playerItem)
player?.play()最后,处理观察者:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "status" && player?.status == AVPlayerStatus.readyToPlay {
indicator.endLoadingActivity(viewController: self)
}
}希望这对遇到和我一样的问题的人有所帮助。
https://stackoverflow.com/questions/47317068
复制相似问题