2016-05-07 21 views
5

Tôi đang chơi video trong ứng dụng Swift của tôi (iOS 9) với đoạn mã sau:AVPlayerController: Toàn màn hình Autolayout hành

 let fileUrl = NSBundle.mainBundle().URLForResource("welcome", withExtension: ".mp4") 
     videoItem = AVPlayerItem(URL: fileUrl!) 
     videoPlayer = AVPlayer(playerItem: videoItem) 
     videoPlayer.addObserver(self, forKeyPath: "rate", options: [.New], context: nil) 

     videoPlayerController.player = videoPlayer 
     videoPlayerController.showsPlaybackControls = false 

     videoPlayerController.view.frame = CGRectMake(0, 0, playerView.frame.size.width, playerView.frame.size.height) 
     playerView.insertSubview(videoPlayerController.view, belowSubview: videoCoverView) 

     videoPlayerController.willMoveToParentViewController(self) 
     addChildViewController(videoPlayerController) 
     videoPlayerController.didMoveToParentViewController(self) 

     playerView.bringSubviewToFront(btnPlay) 

     let asset = AVAsset(URL: fileUrl!) 
     let imageGenerator = AVAssetImageGenerator(asset: asset) 
     let time = CMTime(seconds: asset.duration.seconds/2.0, preferredTimescale: 1) 

     do { 
      let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil) 
      let coverImage = UIImage(CGImage: imageRef) 
      videoCoverView.image = coverImage 
     } catch { 

     } 

videoPlayerController là một thể hiện của AVPlayerViewController. playerView được thêm vào thông qua bảng phân cảnh và có cài đặt Autolayout trên đó. Tôi phải đối mặt với các vấn đề Autloayout khi điều khiển trình phát AVPlayerViewController hiển thị và cũng có thể khi tôi cố gắng ở chế độ toàn màn hình thông qua điều khiển trình phát. Đây là nhật ký được in.

2016-05-07 15:18:19.325 VoxTrain[2085:66307] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x7fb6a2a3f2c0 h=-&- v=-&- _UIBackdropContentView:0x7fb6a2a02310.width == _UIBackdropView:0x7fb6a053bf90.width>", 
    "<NSLayoutConstraint:0x7fb6a2992800 H:|-(14)-[UILabel:0x7fb6a2991220'Hi-Speed Scrubbing'] (Names: '|':_UIBackdropContentView:0x7fb6a2a02310)>", 
    "<NSLayoutConstraint:0x7fb6a2992850 H:[UILabel:0x7fb6a2991220'Hi-Speed Scrubbing']-(14)-| (Names: '|':_UIBackdropContentView:0x7fb6a2a02310)>", 
    "<NSLayoutConstraint:0x7fb6a29649a0 H:|-(0)-[_UIBackdropView:0x7fb6a053bf90] (Names: '|':UIView:0x7fb6a0549220)>", 
    "<NSLayoutConstraint:0x7fb6a298b8a0 H:[_UIBackdropView:0x7fb6a053bf90]-(0)-| (Names: '|':UIView:0x7fb6a0549220)>", 
    "<NSLayoutConstraint:0x7fb6a296f440 H:|-(0)-[UIView:0x7fb6a0549220] (Names: '|':AVAlphaUpdatingView:0x7fb6a053dae0)>", 
    "<NSLayoutConstraint:0x7fb6a296f490 H:[UIView:0x7fb6a0549220]-(0)-| (Names: '|':AVAlphaUpdatingView:0x7fb6a053dae0)>", 
    "<NSLayoutConstraint:0x7fb6a2a40cc0 'UIView-Encapsulated-Layout-Width' H:[AVAlphaUpdatingView:0x7fb6a053dae0(0)]>" 
) 

Sau khi tiếp cận ban đầu, tôi đã cố gắng để thiết lập autolayout trên videoPlayerController's xem với thiết translatesAutoresizingMaskIntoConstraints false. Nhưng vấn đề vẫn còn tồn tại. Làm thế nào tôi có thể khắc phục những vấn đề này?

+0

trùng lặp: http://stackoverflow.com/q/32860362/2415822 – JAL

Trả lời

-1

vấn đề của nó là bạn đang cố gắng để thiết lập showsPlaybackControls = true khi AVPlayerController của bạn là trên màn hình. Làm như vậy sẽ tạo ra các phần tử giao diện người dùng hệ thống, dẫn đến các vấn đề về Bố cục tự động.

Documents rất cụ thể về điểm này:

Đừng sử dụng tài sản này để thay đổi tầm nhìn của phát lại điều khiển trong khi điều khiển giao diện máy nghe là trên màn hình, bởi vì làm như để tạo ra hoặc phá hủy các yếu tố giao diện người dùng.

Link: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayerViewController_Class/#//apple_ref/occ/instp/AVPlayerViewController/showsPlaybackControls

+0

@Abid Tôi đang gặp phải vấn đề tương tự. Bạn có giải pháp nào không? –

+0

Tôi tạo ra một thể hiện AVPlayerViewController và thêm nó vào một cái nhìn như vậy: MoviePlayer = AVPlayerViewController.init() MoviePlayer .allowsPictureInPicturePlayback = false .showsPlaybackControls MoviePlayer = true MoviePlayer .player = AVPlayer.init (url??: ! mục .mediaURL) MoviePlayer .view.translatesAutoresizingMaskIntoConstraints = false .view contentView.addSubview (MoviePlayer) MoviePlayer .view.pinAllAnchors (để:!?! contentView) '' ' tôi vẫn thấy vấn đề bố trí tự động khi tôi đi toàn màn hình và quay lại. –

0

Sử dụng mã này,

viewDidLoad phương pháp:

 let type : String! = "mp4" 
     let targetURL : String? = NSBundle.mainBundle().pathForResource("Welcome", ofType: type) 

     let videoURL = NSURL(fileURLWithPath:targetURL!) 


     let player = AVPlayer(URL: videoURL) 
     let playerController = AVPlayerViewController() 

     playerController.player = player 
     self.addChildViewController(playerController) 
     self.playView.addSubview(playerController.view) 
     playerController.view.frame = playView.bounds 

     player.play() 

Và Storyboard Xem tôi là cung cấp cho bên dưới,

enter image description here

Tôi đã tạo ra các UIView, sau đó đặt phía trên, trái, phải và chiều cao giải quyết. nó làm việc cho tôi

Hy vọng hữu ích

+0

Nope. Tôi đã làm tất cả những thứ này chỉ theo một thứ tự khác. Chỉ có sự khác biệt là chiều cao của PlayerView là tỷ lệ thuận với view ViewController. Video chạy trơn tru. Chỉ có vấn đề xảy ra khi bạn cố gắng hiển thị điều khiển gốc của AVPlayerViewCOntroller bằng cách thiết lập thuộc tính showsPlaybackControls của nó đúng. Và bây giờ nếu bạn cố gắng để đi toàn màn hình bằng cách sử dụng các điều khiển sau đó Autolayout đăng nhập được in trên bàn điều khiển. –