Как изменить размер AVPlayer с родительским видом?

У меня есть AVPlayerView, созданный в соответствии с рекомендациями Apple docs: 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 с представлением моего контроллера представления?

Спасибо


person Krystian    schedule 10.03.2016    source источник


Ответы (1)


AVPlayerLayers автоматически не изменяет размер своих родительских представлений. Если вы собираетесь переопределить layerClass UIView с помощью AVPlayerLayer, вы также должны переопределить его метод layoutSublayersOfLayer следующим образом:

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

И в Свифте 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
    }
}
person WongWray    schedule 27.11.2017