2011-11-20 12 views
10

Apple le falta documentación sobre cómo usar la clase UIPopoverBackgroundView introducida en iOS5. Alguien tiene un ejemplo?Usando UIPopoverBackgroundView clase

me han tratado de una subclase, pero mi XCode 4.2 en Lion no se encuentra UIPopoverBackgroundView.h

Editar: Como era de esperar, lo que debería haber sido importado como #import <UIKit/UIPopoverBackgroundView.h>

+0

¿Estás seguro de que no has podido encontrar la documentación ?: http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIPopoverBackgroundView_class/Reference/Reference.html – CodaFi

+0

Tal vez buscando el SDK incorrecto ? –

+1

Gracias por #import :) – Cesar

Respuesta

13

Para añadir a la otra, enlace -solo respuestas, aquí es cómo se hace esto.

  • Crear una nueva subclase de UIPopoverBackgroundView
  • declaramos lo siguiente en su interfaz:

    +(UIEdgeInsets)contentViewInsets; 
    +(CGFloat)arrowHeight; 
    +(CGFloat)arrowBase; 
    
    @property(nonatomic,readwrite) CGFloat arrowOffset; 
    @property(nonatomic,readwrite) UIPopoverArrowDirection arrowDirection; 
    
  • métodos de la clase son sencillos: contentViewInsets devuelve el ancho de sus fronteras en todo el perímetro (no incluyendo la flecha), arrowHeight es la altura de su flecha, arrowBase es la base de su flecha.

  • Implementa los dos arregladores de propiedades, asegurándose de llamar al [self setNeedsLayout].
  • En su método de inicialización, cree dos vistas de imágenes, una sosteniendo su flecha (que debe ser del tamaño de las dimensiones de la flecha en sus métodos de clase) y otra sosteniendo su imagen de fondo (que debe ser una imagen redimensionable) y añádalas como subvistas. No importa dónde coloque las subvistas en este punto, ya que no tiene una dirección o desplazamiento de flecha. Debe asegurarse de que la vista de la imagen de la flecha esté sobre la vista de la imagen de fondo para que se integre correctamente.
  • Implemento layoutSubviews. Aquí, de acuerdo con las propiedades arrowDirection y arrowOffset, debe ajustar los marcos de la vista de fondo y de la flecha.
    • El marco de la vista de fondo debe ser self.bounds, inserción por arrowHeight en cualquier borde de la flecha está en
    • El marco de la vista flecha debe estar alineado de manera que el centro es arrowOffset de distancia del centro de self (correcta según el eje). Tienes que cambiar la orientación de la imagen si la dirección de la flecha no está arriba, pero mi popover solo estaría arriba, así que no hice eso.

Aquí es el método layoutSubviews para mi hasta sólo subclase:

-(void)layoutSubviews 
{ 
    if (self.arrowDirection == UIPopoverArrowDirectionUp) 
    { 
     CGFloat height = [[self class] arrowHeight]; 
     CGFloat base = [[self class] arrowBase]; 

     self.background.frame = CGRectMake(0, height, self.frame.size.width, self.frame.size.height - height); 

     self.arrow.frame = CGRectMake(self.frame.size.width * 0.5 + self.arrowOffset - base * 0.5, 1.0, base, height); 
     [self bringSubviewToFront:self.arrow]; 

    } 
} 
0

Otro vínculo única respuesta, pero la personalización de UIPopoverBackgroundView es más trabajo de lo que cree dada la limitada documentación disponible y este El proyecto github tiene un completo ejemplo de trabajo que me ahorró mucho tiempo: https://github.com/GiK/GIKPopoverBackgroundView

Es bastante sencillo ingresar en su propio proyecto. La parte más complicada es adaptar las inserciones de la tapa para cualquier imagen personalizada que esté usando. Recomiendo hacer sus personalizaciones in-situ en el proyecto y es fácil verificar que todos los casos de uso de orientación/dirección de popover se muestren correctamente en el simulador antes de migrarlo a su propio proyecto.

Cuestiones relacionadas