【问题标题】:How to make the AVPlayer resize with the parent view?如何使 AVPlayer 与父视图一起调整大小?
【发布时间】:2016-03-10 15:53:00
【问题描述】:

我已经按照 Apple 文档中的建议创建了一个 AVPlayerView: https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html

所以我将该 UIView 子类添加为我的 UIViewController 的子视图。

看起来不错,视频播放效果很好。 但是,当我将视图最小化到一个小窗口时,视频不会随之调整大小。 没关系,当我使用 MPMoviePlayerViewController 时,但我需要使用 AVPlayer 有几个原因[静音音频,同时播放多个视频等]。

这是我的 AVPlayerView 实现:

@implementation VideoView {

}

+ (Class)layerClass {
    return [AVPlayerLayer class];
}

- (AVPlayer*)player {
    return [(AVPlayerLayer *)[self layer] player];
}

- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}

@end

这是我创建 AVPlayer 的方法:

    AVAsset *asset = [AVURLAsset URLAssetWithURL:Url options:nil];
    AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];
    player_vc = [AVPlayer playerWithPlayerItem:anItem];
    player_vc.actionAtItemEnd = AVPlayerActionAtItemEndNone;

    player_layer = [[VideoView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview: player_layer];

    [player_layer setPlayer:player_vc];

这是我用于更改父视图框架的代码:

-(void) minimize {
    [UIView animateWithDuration:2.0
                     animations:^{
                         self.view.frame = resizeFrame;
                      } completion:(void (^)(BOOL)) ^{
                 self.minimized = true;

}

似乎一旦用特定框架创建,我就无法将其更改为其他任何内容。

您能告诉我如何使 AVPlayer 层根据我的视图控制器的视图调整大小吗?

谢谢

【问题讨论】:

    标签: ios objective-c iphone avplayer avplayerlayer


    【解决方案1】:

    AVPlayerLayers 不会随其父视图自动调整大小。如果你打算用 AVPlayerLayer 覆盖 UIView 的 layerClass,你也应该像这样覆盖它的 layoutSublayersOfLayer 方法:

    - (void)layoutSublayersOfLayer:(CALayer *)layer {
        [super layoutSublayersOfLayer:layer];
        if (layer == self.layer) {
           [self layer].frame = self.bounds;
        }
    }
    

    在 Swift 3 中:

    class PlayerLayerDisplayer: UIView {
    
        override class var layerClass: AnyClass {
            get {
                return AVPlayerLayer.self
            }
        }
    
        override func layoutSublayers(of layer: CALayer) {
            super.layoutSublayers(of: layer)
            guard layer == self.layer else {
                return
            }
            layer.frame = self.bounds
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-26
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2020-08-04
      相关资源
      最近更新 更多