AVPlayerLayer anima cambios de ttwig

Cada vez que cambio el marco de mi AVPlayerLayer, el video no cambia de tamaño de inmediato, sino que se anima al nuevo tamaño.

Por ejemplo: cambio el marco de (0, 0, 100, 100) a (0, 0, 400, 400), el marco de la vista cambia inmediatamente, pero el tamaño del video está animado al nuevo tamaño.

¿Alguien ha encontrado este problema? Y si sí, ¿alguien sabe una forma de desactivar la animation pnetworkingeterminada?

¡Gracias!

Puede intentar deshabilitar acciones implícitas y usar animaciones de longitud cero:

CALayer *videolayer = <# AVPlayerLayer #> [CATransaction begin]; [CATransaction setAnimationDuration:0]; [CATransaction setDisableActions:YES]; CGRect rect = videolayer.bounds; rect.size.width /= 3; rect.size.height /= 3; videolayer.bounds = rect; [CATransaction commit]; 

Esto es lo que utilicé:

 AVPlayerLayer * playerLayer = <# AVPlayerLayer #>; playerLayer.frame = <# CGRect #>; [playerLayer removeAllAnimations]; 

Espero que esto ayude. No sé si son sus mejores prácticas, pero funciona para mí. Parece que siempre que se usa ".frame" o "setFrame", agrega animation a la capa.

La forma más fácil y más limpia de lidiar con esto es crear una subclass UIView que tenga AVPlayerLayer como capaClase. Al hacer esto, AVPlayerLayer se comportará como una capa normal de UIView. Puede cambiar el marco de la vista en lugar de la capa y no ocurrirán animaciones implícitas.

AVPlayerLayerView.h

 #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface AVPlayerLayerView : UIView @property (nonatomic, readonly) AVPlayerLayer *playerLayer; @end 

AVPlayerLayerView.m

 #import "AVPlayerLayerView.h" @implementation AVPlayerLayerView + (Class)layerClass { return [AVPlayerLayer class]; } - (AVPlayerLayer *)playerLayer { return (AVPlayerLayer *)self.layer; } @end 

Ahora puedes hacer esto:

 playerLayerView.frame = CGRectMake(0, 0, 400, 400); 

Para asociar AVPlayerLayer con un AVPlayer, simplemente haga esto:

 playerLayerView.playerLayer.player = player; 

Lo usas ?:

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

Probablemente esto, lo que ayudará en algunos casos:

agregando setter personalizado 'setFrame:' en la vista que contiene la capa de jugador

 - (void)setFrame:(CGRect)frame { [super setFrame:frame]; self.playerLayer.frame = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height); } 

Esto es lo que hago en Swift justo después de cambiar el playerLayer del playerLayer :

 playerLayer.removeAllAnimations()