2017-11-15 36 views
0

URL의 비디오를 다른보기에 중첩되어 있지 않은 AVPlayerView로 시작하는 tvOS 용 앱을 작성 중입니다. 문제는로드가 진행되는 동안 사용자가 아무런 문제가 없다는 것을 알았 기 때문에 화면 중앙에 활동 표시기를 추가하려고했습니다.Swift tvOS : AVPlayerView의 스크린 센터 얻기

비디오가로드되는 동안보기의 경계가 (0, 0, 0, 0)으로 설정되므로 비디오가로드되는 동안 화면 중앙을 가져 오는 것이 쉽지 않으므로 하위보기의 center = view.center를 설정하십시오. 작동하지 않습니다 (그냥 화면의 왼쪽 위 모서리에 내 하위보기를 추가합니다).

프레임이 (0, 0, 0, 0)으로 설정되면 어떻게하면 화면 중앙에 하위보기를 추가 할 수 있습니까?

답변

0

운 좋게도 나는 대답을 스스로 찾을 수있었습니다. UIScreen은 iOS 기기에서와 마찬가지로 tvOS와 잘 작동합니다. 내 완벽한 솔루션은 아래 있습니다, 누군가가 시간을 절약하는 데 도움이되기를 바랍니다. 나는 끝을 촉발시키는 내 관찰자들을 포함시키고있다.

나는이 말은 경계

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 
를 얻을 수 UIScreen를 사용하는 부분 인 활동

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 

을 처리하는 데 사용되는 클래스는

좀 선명도를 추가 할 레이블을 추가

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) 

작동 표시등 애니메이션을 시작합니다 (I 어떤 플레이어 항목의 키 설정)

indicator.beginLoadingActivity(viewController: self, color: .white) 

플레이어에 알림 추가 및 재생 시작

이것이 내가했던 것과 같은 몇 가지 문제로 실행 다른 사람을 도움이

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) 
    } 
} 

희망 :3210

playerItem.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil) 
player = AVPlayer(playerItem: playerItem) 
    player?.play() 

마지막으로, 관찰자를 처리합니다.