descargar - screen mirroring iphone
Personaliza la apariencia del botón Airplay. (5)
Creo que hay una mejor solución para esto desde iOS 6: Usar
- (void)setRouteButtonImage:(UIImage *)image forState:(UIControlState)state;
en MPVolumeView.
Utilizo una superposición de degradado estándar (hecha en photoshop) para hacer que los botones se vean mejor en mi aplicación. He añadido un botón de Airplay, pero la estética no coincide.
Realmente quiero poner una capa de degradado sobre ella para que coincida, pero cualquier cosa que pueda encontrar solo muestra cómo hacerlo con un png, no con una vista UIV existente. Si no es la capa de degradado, solo necesito de alguna manera, de alguna manera, cambiar la apariencia del botón de reproducción de Apple mientras mantengo su funcionalidad intacta.
El código de configuración es simple:
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:frame];
[volumeView setShowsVolumeSlider:NO];
[bottomPanel addSubview:volumeView];
¿Cómo puedo obtener la apariencia de esto para que coincida con mis controles?
Después de aceptar la respuesta de @Erik B y otorgarle la recompensa, descubrí que había más ajustes necesarios para que funcionara. Estoy publicando aquí para el beneficio de futuros buscadores de SO.
El problema que estaba viendo era que los mecanismos internos de los botones asignaban la imagen en función del estado actual de Airplay. Por lo tanto, cualquier personalización que hice durante el inicio no se mantendría si el receptor de Airplay desapareciera o el estado cambiara de alguna manera. Para resolver esto, configuro una observación KVO en la tecla alpha
del botón. Noté que el botón siempre está desvanecido dentro / fuera, lo cual es una animación en alpha
.
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectZero];
[volumeView setShowsVolumeSlider:NO];
for (UIButton *button in volumeView.subviews) {
if ([button isKindOfClass:[UIButton class]]) {
self.airplayButton = button; // @property retain
[self.airplayButton setImage:[UIImage imageNamed:@"airplay.png"] forState:UIControlStateNormal];
[self.airplayButton setBounds:CGRectMake(0, 0, kDefaultIconSize, kDefaultIconSize)];
[self.airplayButton addObserver:self forKeyPath:@"alpha" options:NSKeyValueObservingOptionNew context:nil];
}
}
[volumeView sizeToFit];
Entonces observo el valor cambiado de los botones alpha
.
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([object isKindOfClass:[UIButton class]] && [[change valueForKey:NSKeyValueChangeNewKey] intValue] == 1) {
[(UIButton *)object setImage:[UIImage imageNamed:@"airplay.png"] forState:UIControlStateNormal];
[(UIButton *)object setBounds:CGRectMake(0, 0, kDefaultIconSize, kDefaultIconSize)];
}
}
No olvides eliminar el observador si destruyes el botón.
- (void)dealloc {
[self.airplayButton removeObserver:self forKeyPath:@"alpha"];
…
}
En función de la observación del código, el botón se interrumpirá si Apple cambia la jerarquía de vista interna del MPVolumeView
para agregar / eliminar / alterar las vistas de manera que aparezca un botón diferente. Esto lo hace algo frágil, así que úselo bajo su propio riesgo, o elabore un plan b en caso de que esto suceda. Lo he estado usando durante más de un año en producción sin problemas. Si quieres verlo en acción, mira la pantalla principal del jugador en Ambiance
El código anterior no funcionó para mí (ya que el botón AirPlay se agrega más adelante). Como solución alternativa, puede utilizar un UIButton estándar en su interfaz de usuario y activar un AirPlay en un botón MPVolumeView
(oculto) con
for (UIButton *button in volumeView.subviews)
{
if ([button isKindOfClass:[UIButton class]])
{
[button sendActionsForControlEvents:UIControlEventTouchUpInside];
}
}
Un efecto secundario es que el botón no se oculta automáticamente cuando solo hay una ruta disponible, lo que puede o no ser el comportamiento deseado.
Finalmente encontré un auricular bluetooth para poder probar el botón. Cambiar su apariencia era muy simple. Aquí está el código:
for (UIButton *button in volumeView.subviews) {
if ([button isKindOfClass:[UIButton class]]) {
[button setImage:[UIImage imageNamed:@"custom-route-button.png"] forState:UIControlStateNormal];
[button sizeToFit];
}
}
Eso es todo lo que hay que hacer.
He creado un método personalizado que funciona perfectamente ...
-(void)airplayIcon:(CGRect)rect {
UIView *aiplayView = [[UIView alloc] initWithFrame:self.bounds];
aiplayView.clipsToBounds = true;
aiplayView.backgroundColor = [UIColor clearColor];
[self addSubview:aiplayView];
MPVolumeView *airplayVolume = [[MPVolumeView alloc] initWithFrame:aiplayView.bounds];
airplayVolume.showsVolumeSlider = false;
[aiplayView addSubview:airplayVolume];
for (UIButton *button in airplayVolume.subviews) {
[button setFrame:self.bounds];
if ([button isKindOfClass:[UIButton class]]) {
[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[button sizeToFit];
}
}
}