¿Cómo agregar MPVolumeView a través de Xcode Designer?

Originalmente agregué un MPVolumeView dinámicamente en una página ...

#import "MediaPlayer/MPVolumeView.h"
.
.
-(IBAction) handleVolumeButtonClicked:(id) sender {
    if (volumeView == nil) {
        volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)];
        [self.view addSubview:volumeView];
        [volumeView release];
    } else {
        [volumeView removeFromSuperview];
        volumeView = nil;
    }
}

Pero por alguna razón comencé a recibir informes de fallas de la aplicación al agregar dinámicamente el componente de volumen.

Para solucionar esto, decidí intentar agregar el componente a la vista a través del diseñador de XCode, ¡pero luego me di cuenta de que no sabía cómo hacer esto!

Primero arrastré un 'Objeto' de la plantilla a la paleta Objeto, pero luego descubrí que no podía agregarlo a la vista. Así que descarté esa idea y luego arrastré el objeto 'Ver' directamente a la vista .xib.

Una vez que se agregó el componente, intenté cambiar la 'Clase personalizada' a 'MPVolumeView', pero la vista simplemente representó un rectángulo vacío. La ejecución del código en el simulador no pudo representar nada.

¿Alguien sabe qué pasos me faltan para agregar una clase a la vista que ya no existe en la paleta?

preguntado el 16 de mayo de 11 a las 17:05

6 Respuestas

No estoy seguro de si ya se ha dado cuenta de esto. Acabo de crear una aplicación con un control deslizante de volumen con éxito. Esto es lo que hice (de MPVolumeView):

  • Se agregó una vista UIV y se dimensionó y posicionó como se desea en la vista .xib.
  • Cambió la clase a MPVolumeView
  • Agregué lo siguiente a mi archivo .h:
#import 

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeViewParentView;
}
@property (nonatomic, retain) IBOutlet MPVolumeView *mpVolumeViewParentView;

@end
  • Agregué lo siguiente a mi archivo .m:
#import "MyView.h"

@implementation MyView

@synthesize mpVolumeViewParentView = _mpVolumeViewParentView;

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self mpVolumeViewParentView] setBackgroundColor:[UIColor clearColor]];
    MPVolumeView *myVolumeView = [[MPVolumeView alloc] initWithFrame:[[self mpVolumeViewParentView] bounds]];
    [[self mpVolumeViewParentView] addSubview:myVolumeView];
    [myVolumeView release];
}
- (void)dealloc {
    [_mpVolumeViewParentView release];
    [super dealloc];
}

Espero eso ayude.

Respondido 02 Oct 15, 23:10

¿Agrega un MPVolumeView, que creó mediante programación, como una subvista a un MPVolumeView ya existente que creó en el generador de interfaces? Lo siento, pero eso no tiene ningún sentido. Ahora tiene dos vistas de volumen anidadas, la creada mediante programación, una que cubre la otra. Lo siento, pero las otras respuestas aquí son mucho mejores que esta en mi humilde opinión; esa no es la forma en que nadie debería hacerlo. - mecki

@RoLYroLLs Creo que ahora es el momento adecuado para editar tu respuesta. - Florik

Agregar un UIView genérico y configurar la clase personalizada en MPVolumeView sí funciona. Asegúrese de hacer lo siguiente:

  • Agregue el marco MediaPlayer a su proyecto. La carga de MPVolumeView fallará silenciosamente (aunque con un mensaje registrado en la consola) si no lo hace.
  • Ejecutar en un dispositivo real. El simulador no mostrará el control deslizante de volumen.
  • Vuelva a verificar que su vista no se auto-redimensione fuera de la vista.

Respondido 30 ago 12, 17:08

¡El simulador no mostrará la diapositiva de volumen! ¡Gracias, @Shane Arney! - Valentin Shamardin

tenga en cuenta que si no funciona, agregue este MPVolumeView a cada vista en su jerarquía, desde la UIView actual hasta la ventana raíz. Eso fue lo que me ayudó. - yonivav

Debería intentar ejecutar su aplicación en un dispositivo iOS, no en el simulador. En el simulador, MPVolumeView muestra "No hay volumen disponible" en texto blanco. Si el color de fondo de la vista se establece en blanco (predeterminado en Interface Builder), la vista parece estar vacía.

Respondido el 24 de junio de 11 a las 21:06

Incluso mucho más simple:

Agregue una vista y cambie la Clase a MPVolumeView y declare en .h

    #import <MediaPlayer/MediaPlayer.h>

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeview;
}

En .m simplemente asignelo.

- (void)viewDidLoad {
    [super viewDidLoad];
    [MPVolumeView alloc];

    // set properties using the declared object in .h
    // Example
    [mpVolumeview setShowsVolumeSlider:NO]; 
}

Respondido el 15 de enero de 14 a las 16:01

Cambié De Roman Aliyev decisión un poco.

Puede configurar MPVolumeView como subclase de UISlider

@IBOutlet weak var volume: MPVolumeView!

let volumeSetting = volume.subviews.first as? UISlider
    volumeSetting?.minimumValueImage = UIImage(named: "SoundQuiet")
    volumeSetting?.maximumValueImage = UIImage(named: "SoundLoud")
    ...

Respondido el 08 de Septiembre de 19 a las 14:09

Encontré otra solución.

  • Agregue UISlider a través de Xcode Interface Builder.
  • Configure su apariencia en IB.
  • Reemplácelo programáticamente con MPVolumeView de la siguiente manera:
class PlayerView: UIView {
    @IBOutlet weak var volumeViewMock: UISlider!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.volumeViewMock.replaceWithMPVolumeView()
    }
}

extension UISlider {
    func replaceWithMPVolumeView() {
        // do this only once
        guard !self.isHidden else { return }

        let volumeView = MPVolumeView()
        volumeView.showsRouteButton = false

        // get the slider of volumeView and configure it in the same way as the IB slider
        guard let volumeViewSlider = volumeView.subviews.first as? UISlider else { return }
        volumeViewSlider.minimumValueImage = self.minimumValueImage
        volumeViewSlider.maximumValueImage = self.maximumValueImage
        volumeViewSlider.tintColor = self.tintColor
        volumeViewSlider.minimumTrackTintColor = self.minimumTrackTintColor
        volumeViewSlider.maximumTrackTintColor = self.maximumTrackTintColor
        volumeViewSlider.thumbTintColor = self.thumbTintColor

        guard let parentView = self.superview else { return }
        parentView.addSubview(volumeView)

        // frame of volumeView and frame of the IB slider should be the same
        volumeView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            volumeView.topAnchor.constraint(equalTo: self.topAnchor),
            volumeView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
            volumeView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            volumeView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            ])

        // hide the IB slider
        self.isHidden = true
    }
}

Respondido 15 Abr '19, 15:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.