Problema de animation de MPVolumeView

Cada vez que agrego MPVolumeView como una subvista a la UIViewController mi UIViewController , hay una animation rápida (el MPVolumeView expande de izquierda a derecha) que se ve realmente extraño. Estoy buscando una manera de deshacerte de esta animation, ¿alguien se ha enfrentado a este problema?

Casi acepté que este es un error de MPVolumeView pero luego me di count de que Apple definitivamente está usando un MPVolumeView en su aplicación de música nativa, no hay animaciones extrañas allí … Entonces debe haber algo que estoy haciendo mal.

ACTUALIZAR:

El código es bastante sencillo pero fue solicitado en los comentarios, así que aquí está:

 MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10.f, 0.f, CGRectGetWidth(self.view.frame) - 20.f, 30.f)]; [[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumValueImage:[UIImage imageNamed:@"icon-volumeMin"]]; [[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumValueImage:[UIImage imageNamed:@"icon-volumeMax"]]; volumeView.center = CGPointMake(0.5f * CGRectGetWidth(self.view.frame), 0.5f * CGRectGetHeight(self.view.frame)); volumeView.showsRouteButton = NO; [self.view addSubview:volumeView]; 

Hice un proyecto muy simple en github para demostrar el problema, pero tienes que ejecutarlo en un dispositivo, ya que MPVolumeView no aparece en el simulador. O simplemente eche un vistazo a este gif:

gif :

Una forma posible de eliminar este comportamiento es subclass MPVolumeView y realizar un trabajo adicional después [super layoutSubviews] .

 - (void)layoutSubviews { [super layoutSubviews]; [self xy_recursiveRemoveAnimationsOnView:self]; } - (void)xy_recursiveRemoveAnimationsOnView:(UIView *)view { [view.layer removeAllAnimations]; for (UIView *subview in view.subviews) { [self xy_recursiveRemoveAnimationsOnView:subview]; } } 

Esto elimina todas las animaciones insertadas. Así que asegúrate de que eso es lo que quieres, ya que esto es bastante exagerado. También se podría eliminar las animaciones de position y bounds (ver removeAnimationForKey: .

Te arreglé tu demo-code

 @implementation F17YViewController { MPVolumeView *volumeView; } - (void)viewDidLoad { [super viewDidLoad]; volumeView = [[MPVolumeView alloc] init]; volumeView.showsRouteButton = NO; volumeView.hidden = true; [[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumValueImage:[UIImage imageNamed:@"icon-volumeMin"]]; [[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumValueImage:[UIImage imageNamed:@"icon-volumeMax"]]; [self.view addSubview:volumeView]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; volumeView.frame = CGRectMake(10.f, 0.f, CGRectGetWidth(self.view.frame) - 20.f, 30.f); volumeView.center = CGPointMake(0.5f * CGRectGetWidth(self.view.frame), 0.5f * CGRectGetHeight(self.view.frame)); } - (IBAction)showVolumeView:(id)sender { volumeView.hidden = false; } 

Debería hacer llamadas de layout en viewWillLayoutSubviews.

En lugar de crear un nuevo MPVolumeView con cada button presionado, debe crear uno en viewDidLoad y esconderlo y luego mostrarlo cuando se presiona el button.