2010-02-04 13 views
6

Non sono sicuro se "gestore di layout" è il termine corretto, ma sto cercando un modo per far entrare le UIViews nella loro visualizzazione genitore, come se fossero le div di sinistra in una pagina HTML. C'è un modo semplice per farlo, tramite l'iPhone o l'esterno?iPhone - Gestione layout per UIViews?

+3

stavo pensando la stessa cosa. Una raccolta di LayoutManager come in Java Swing sarebbe utile se davvero non volessi preoccuparti di InterfaceBuilder, ma anche di non dover gestire le complessità del posizionamento di tutto a mano. – ra9r

+0

C'è solo la vista del webkit se vuoi mostrare solo cose. Ho fatto confusione con l'incorporamento di html per roba dello schermo informativo ben strutturata. – morgancodes

+0

Questo non esiste realmente in iOS 5 o versioni precedenti.Per informazioni su iOS 6, consulta la documentazione protetta dalla NDA che non possiamo discutere apertamente qui. –

risposta

0

Non conosco l'API per farlo. Core Animation su Mac ha alcune funzionalità di layout, ma penso che non sia stato incluso su iPhone.

Ciò che descrivi non sembra estremamente difficile. Open source vero? :-)

+1

Sì! Sono generalmente troppo sciatto/pigro/egoista per qualsiasi mia intenzione open source di andare ovunque. Ma forse sarà diverso :) – morgancodes

1

Non c'è nulla di simile a questo veramente costruito nell'sdk, ma non dovrebbe essere troppo difficile per ottenere il comportamento che stai cercando. Basta chiamare il

NSArray *subs = [parentView subviews]; 

per ottenere tutte le sottoview già presenti. Loop attraverso di loro come questo

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

e posizionare la nuova visualizzazione accanto ad essa

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

......

si può scrivere molto più pulito di quello e non v'è un molto più controllo e ragionamento che devi fare per ottenere tutto il comportamento del float, ma questo è l'approccio di base che prenderei. Non so se c'è una lib di terze parti che potresti usare o meno.

+1

Grazie Joe, andrò avanti e lo farò. – morgancodes

+0

@morgancodes Ho scritto una soluzione completa basata su questa risposta: http://stackoverflow.com/a/11379438/974531 –

2

Dopo aver effettuato alcune ricerche ho trovato questo: http://code.google.com/p/layoutmanagers/ Last Development era nel dicembre 2009 ma a prima vista, sembra che possa essere ancora applicabile alle versioni correnti di iOS.

+0

Ho creato un fork di quanto sopra su github: https://github.com/RefuX/LayoutManagers-Fork e ha aggiunto GridLayout. L'ho usato su interfacce utente iPhone e iPad. Per iOS 4 e 5. Mi piace :) – RefuX

1

Ecco una soluzione completa (basata su the answer by Joe Cannatti):

  1. Aggiungi un UIView allo storyboard, e collegarlo al vostro ViewController sotto qualche nome, per esempio container. (Nel caso il vostro contenitore è vista tutta la visione, è possibile utilizzare self.view invece di container all'interno ViewController.m.)

  2. Creare e aggiungere elementi dell'interfaccia utente a container. Ad esempio, è possibile creare e aggiungere un UILabel-container con:

    UILabel* label = [[UILabel alloc] init]; 
    label.text = @"Foo"; 
    [label sizeToFit]; 
    [container addSubview:label]; 
    
  3. Inizialmente, e ogni volta che si aggiungere/rimuovere/modificare elementi dell'interfaccia utente da/per/nel raggio di container, è possibile li ri-organizzare in flusso Layout 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); 
    
Problemi correlati