2010-02-04 9 views
6

No estoy seguro de si el "administrador de diseño" es el término correcto, pero estoy buscando una forma de hacer que UIViews fluya a su vista principal, como lo haría un div en una página HTML. ¿Hay una manera fácil de hacerlo, ya sea a través de las API de iPhone o algo externo?iPhone - ¿Administrador de diseño para UIViews?

+3

solo estaba pensando lo mismo. Una colección de LayoutManagers como en Java Swing sería útil cuando realmente no quiere molestarse con InterfaceBuilder, pero tampoco quiere tener que lidiar con las complejidades de posicionar todo a mano. – ra9r

+0

Solo está la vista de webkit si solo quieres mostrar cosas. He estado jugando con la incrustación de html para cosas de la pantalla de información bien presentada. – morgancodes

+0

Esto realmente no existe en iOS 5 o anterior.Para obtener información sobre iOS 6, consulte su documentación protegida por NDA, que aquí no podemos analizar abiertamente. –

Respuesta

0

No conozco una API para hacer esto. Core Animation en la Mac tiene algunas cosas de diseño, pero creo que no estaba incluido en el iPhone.

Lo que usted describe no parece extremadamente difícil. ¿De código abierto? :-)

+1

¡Sí! En general, soy demasiado descuidado/flojo/egoísta para que cualquiera de mis intenciones de código abierto vaya a ninguna parte. Pero tal vez esto sea diferente :) – morgancodes

1

No hay nada como esto realmente incorporado en el SDK, pero no debería ser demasiado difícil conseguir el comportamiento que buscas. Simplemente llame al

NSArray *subs = [parentView subviews]; 

para obtener todas las subvistas ya presentes. Bucle a través de ellos de esta manera

CGRect leftMostViewsFrame = nil; 
for(UIView *cur in subs){ 
    CGRect where = cur.frame; 
    //find the left most frame for a given X coord 
} 

y colocar la nueva vista al lado de él

newView.frame = CGRectMake(leftMostViewsFrame.origin.x + leftMostViewsFrame.size.width, 
[parentView addSubview:newView]; 

......

se puede escribir mucho más limpia que la que y hay una Mucho más control y razonamiento que necesita hacer para obtener todo el comportamiento de flotación, pero ese es el enfoque básico que tomaría. No sé si hay una biblioteca de terceros que podrías usar o no.

+1

Gracias Joe, voy a seguir adelante y hacer eso. – morgancodes

+0

@morgancodes Escribí una solución completa basada en esta respuesta: http://stackoverflow.com/a/11379438/974531 –

2

Después de hacer algunas búsquedas encontré esto: http://code.google.com/p/layoutmanagers/ Última actualización fue en diciembre de 2009, pero a primera vista, parece que todavía puede ser aplicable a las versiones actuales de iOS.

+0

Creé un tenedor de los anteriores en github: https://github.com/RefuX/LayoutManagers-Fork y agregó GridLayout. Lo he usado en las IU de iPhone y iPad. Para iOS 4 y 5. Me gusta :) – RefuX

1

Aquí es una solución completa (basado en the answer by Joe Cannatti):

  1. Añadir un UIView a su guión, y vincularlo a su ViewController bajo un nombre, por ejemplo, container. (En caso de que su vista de contenedor es la visión de conjunto, se puede utilizar en lugar de self.viewcontainer dentro de su ViewController.m.)

  2. Crear y añadir elementos de la interfaz decontainer. Por ejemplo, puede crear y añadir un UILabel a container con:

    UILabel* label = [[UILabel alloc] init]; 
    label.text = @"Foo"; 
    [label sizeToFit]; 
    [container addSubview:label]; 
    
  3. principio, y siempre que se añada/eliminar/modificar los elementos de la interfaz a/desde/dentro de container, puede volver a organizar en el flujo de diseño con:

    float x = 0, y = 0, width = container.frame.size.width, rowHeight = 0; 
    for (UIView* view in container.subviews) { 
        // only re-arrange user-added views (change condition as required) 
        if (![view isKindOfClass:UILabel.class]) continue; 
        float w = view.frame.size.width, h = view.frame.size.height; 
        bool fitsInRow = x + w <= width; 
        if (!fitsInRow) {x = 0; y += rowHeight; rowHeight = h;} 
        view.frame = CGRectMake(x, y, w, h); 
        x += w; 
        rowHeight = MAX(rowHeight, h); 
    } 
    // if container is a UIScrollView, change content size 
    container.contentSize = CGSizeMake(width, y + rowHeight); 
    
Cuestiones relacionadas