2011-10-05 7 views
6

Tengo un montón de problemas al agregar dinámicamente subvistas a un UIScrollView. La vista de desplazamiento funciona bien con el contenido creado en una NIB, pero dado que las subvistas que se mostrarán dependen de los datos de mi aplicación (una mezcla de imágenes, etiquetas, botones de opción, etc.) necesito poder crearlos y visualizarlos dinámicamente.Subvistas añadidas dinámicamente en un UIScrollView que no aparece

De acuerdo con todo lo que he leído, parece bastante sencillo en varios sitios y en la documentación de Apple. En viewDidLoad del controlador de vista, he añadido el código siguiente,

UILabel *testLabel = [[UILabel alloc] init]; 
[testLabel setFrame:CGRectMake(50, 50, 100, 40)]; 
[testLabel setText:@"My Test label"]; 
[scrollView addSubview:testLabel]; 

[testLabel release]; 

La etiqueta no aparecerá en la vista de desplazamiento en absoluto, pero si añado el testLabel a self.view, entonces aparece (pero no en el contenido de desplazamiento obviamente). Incluso intenté agregar el código a viewDidAppear en caso de que no entendiera el orden de los eventos sin suerte.

Cuando revisé el depurador, noté que la dirección de la vista de desplazamiento es 0x0, lo que supongo que es nulo por alguna razón que explicaría por qué no funciona. Estaba bajo el supuesto de que si conectaba este puntero scrollView a la vista de desplazamiento real en IB, se le asignaría automáticamente la dirección correcta. ¿Es esto incorrecto? Si este es el caso, ¿cómo hago para obtener la dirección de la vista?

- ACTUALIZACIÓN -
Gracias por todo el comentario. Revisé todo lo que todos sugirieron y sin dudas todo fue correcto. No necesité establecer el tamaño del contenido ya que tenía otras etiquetas ficticias (para probar que el desplazamiento funcionaba) en el NIB. Pero lo recordaré para más adelante :-)

¡Curiosamente, sin embargo, después de revisar el código nuevamente y no hacer ningún cambio, lo ejecuté de nuevo y simplemente funcionó! No sé por qué, pero voy a publicar la razón por la que si alguna vez lo averigüe ...

+0

¿Está llamando [super viewDidLoad] primero? – Colin

+0

¿Podría publicar más código?En particular, estoy interesado en a) cómo ha inicializado la instancia de UIScrollView, yb) el punto en ViewController padre donde ha adjuntado scrollView a self.view. ¡Gracias! –

+0

@AsimIhsan No creé dinámicamente la vista de desplazamiento, solo las subvistas. Creé la vista de desplazamiento dentro de un UIViewController usando Interface Builder y la configuré allí porque no he podido hacer que funcione de otra manera. – richard

Respuesta

3

Cuando se utiliza ScrollView debe configurar el tamaño de contenido haciendo:

scrollView.contentSize = CGSizeMake(@width,@height); 

En este caso, el tamaño debe ser más grande el 50,50 si quieres ver la etiqueta

espero que ayudó

2

Como se describe en su pregunta usted está trabajando con un ScrollView la que ha añadido en el XI ter.

Cuando declara una salida como IBOultlet UIScrollView * scrlvDynamicContent;

y conecta lo mismo a su vista de desplazamiento en el constructor de interfaz, idealmente obtendrá la vista de desplazamiento asignada después de llamar al método viewdidLoad.

hacerlo algo tan

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    [self createDynamicView]; 
} 

donde se puede generar la visión dinámica de la siguiente manera

-(void)createDynamicView{ 

    CGFloat yOffset = 0; 

    for (int i=0;i<5;i++) { 
     yOffset += 5; 
     UILabel* lblHeaderTitle = [[UILabel alloc] initWithFrame:CGRectMake(8, yOffset, 310, 21)]; 
     [lblHeaderTitle setTextAlignment:UITextAlignmentLeft]; 
     [lblHeaderTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0f]]; 
     [lblHeaderTitle setText:[currentDict valueForKey:@"TITLE"]]; 
     [lblHeaderTitle setTextColor:[UIColor blackColor]]; 


     [scrlvDynamicContent addSubview:lblHeaderTitle]; 
     [lblHeaderTitle release]; 
     //INCREMNET in yOffset 
     yOffset += 25; 

    [scrlvDynamicContent setContentSize:CGSizeMake(320, yOffset)]; 

} 

Sólo asegúrese de que scrlvDynamicContent está correctamente conectado a su salida debería ajustarse a su propietario del archivo

0
[scrollView setFrame:CGRectMake(0,0,320,460)]; 
[scrollView setContentSize:CGSizeMake(100, 40)]; 
[self.view addSubview:scrollView]; 


UILabel *testLabel = [[UILabel alloc] init]; 
[testLabel setFrame:CGRectMake(50, 50, 100, 40)]; 
[testLabel setText:@"My Test label"]; 


[scrollView addSubview:testLabel]; 

[testLabel release]; 
Cuestiones relacionadas