2013-05-08 12 views
7

Sto provando a generare una vista nel codice. Ecco la gerarchia del mio punto di vista dell'oggettoUIScrollView con iOS Layout automatico Vincoli: dimensioni errate per subviews

  • UIScrollView
    • UIView
      • UIButton

Lo ScrollView dovrebbe essere la stessa dimensione della finestra. Il pulsante dovrebbe essere il più grande possibile. Sto utilizzando layout automatico iOS, quindi le stringhe vincolo per tutti i miei oggetti simile a questa

H:|[object]| 
V:|[object]| 

Ho anche impostato translatesAutoresizingMaskIntoConstraints-NO per ogni oggetto.

Il problema è che il pulsante ottiene solo la dimensione del pulsante predefinita. L'oggetto vista padre (UIView) ottiene solo le dimensioni di cui ha bisogno le sottoview.

enter image description here

rosso: UIScrollView/giallo: UIView

Come posso forzare quelle viste ad essere grande come lo ScrollView?

Quando uso un UIView anziché ° UIScrollView tutto funziona alla grande ...

Ecco po 'di codice:

- (void) viewDidLoad { 

     [super viewDidLoad]; 

     // SCROLL VIEW 
     UIScrollView* scrollView = [UIScrollView new]; 
     scrollView.backgroundColor=[UIColor redColor]; 
     scrollView.translatesAutoresizingMaskIntoConstraints = NO; 

     //CONTAINER VIEW 
     UIView *containerView = [UIView new]; 
     containerView.translatesAutoresizingMaskIntoConstraints = NO; 
     containerView.backgroundColor = [UIColor yellowColor]; 
     [scrollView addSubview:containerView]; 

     // CONSTRAINTS SCROLL VIEW - CONTAINER VIEW 
     [scrollView addConstraints: 
     [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView]|" 
               options:0 metrics:nil 
                views:@{@"containerView":containerView}]]; 
     [scrollView addConstraints: 
     [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView]|" 
               options:0 metrics:nil 
                views:@{@"containerView":containerView}]]; 

     // BUTTON 
     UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     button.translatesAutoresizingMaskIntoConstraints = NO; 
     [button setTitle:@"I'm way to small" forState:UIControlStateNormal]; 
     [containerView addSubview:button]; 

     // CONSTRAINTS CONTAINER VIEW - BUTTON 
     [containerView addConstraints: 
     [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button]|" 
               options:0 metrics:nil 
                views:@{@"button":button}]]; 
     [containerView addConstraints: 
     [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button]|" 
               options:0 metrics:nil 
                views:@{@"button":button}]]; 
     self.view = scrollView; 

    } 

UPDATE: Io davvero non lo so, perché questo sta accadendo . Se si imposta la vista in IB, si collegano le prese e si installa la vista nel codice, la vista a scorrimento si comporta come una vista normale (che rimbalza verticalmente). La sua contentSize non è calcolata correttamente. Più here. Ma come farlo correttamente?

+0

Questa è una soluzione piuttosto complicata solo per mostrare un pulsante a schermo intero. Spero di aver risposto alla domanda tecnica, ma non sono ancora chiaro perché lo stai facendo in questo modo. – Rob

+0

Per favore, smetti di ringraziare per i post - le firme non appartengono a questo. Grazie! – Undo

risposta

23

Un paio di osservazioni:

  1. vincoli per viste secondarie in vista di scorrimento non funzionano come vincoli in altre viste. Sono utilizzati per impostare contentSize della visualizzazione di scorrimento. (Vedi TN2154.) In questo modo, si getta un sacco di cose su una vista di scorrimento, si impostano i vincoli per il materiale al suo interno e viene calcolato il numero contentSize. È una funzionalità molto interessante, ma è antitetica a ciò che stai cercando di fare qui.

  2. Peggio ancora, i pulsanti, a meno che non si imposti un vincolo esplicito per la loro larghezza e altezza di un pulsante, verranno ridimensionati in base al loro contenuto.

L'effetto netto di queste due osservazioni è che i vostri vincoli esistenti dicono "(a) impostato il mio contenitore di essere le dimensioni del mio tasto; (b) che il mio pulsante stesso ridimensionare dinamicamente alle dimensioni del testo e (c) impostare il mio viewview contentSize in base alla dimensione del mio contenitore (che è la dimensione del pulsante). "

Non sono sicuro di quale sia il problema aziendale. Ma qui ci sono alcuni vincoli che consentano di raggiungere quello che penso la tua domanda tecnica era:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIView *view = self.view; 

    UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    scrollView.backgroundColor = [UIColor redColor]; // just so I can see it 
    scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.view addSubview:scrollView]; 

    UIView *containerView = [[UIView alloc] init]; 
    containerView.backgroundColor = [UIColor yellowColor]; // just so I can see it 
    containerView.translatesAutoresizingMaskIntoConstraints = NO; 
    [scrollView addSubview:containerView]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    button.translatesAutoresizingMaskIntoConstraints = NO; 
    [button setTitle:@"I'm the right size" forState:UIControlStateNormal]; 
    [containerView addSubview:button]; 

    NSDictionary *views = NSDictionaryOfVariableBindings(scrollView, button, view, containerView); 

    // set the scrollview to be the size of the root view 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 

    // set the container to the size of the main view, and simultaneously 
    // set the scrollview's contentSize to match the size of the container 

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView(==view)]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 

    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView(==view)]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 

    // set the button size to be the size of the container view 

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button(==containerView)]" 
                      options:0 
                      metrics:nil 
                      views:views]]; 

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button(==containerView)]" 
                      options:0 
                      metrics:nil 
                      views:views]]; 

} 

Francamente, non capisco l'intento commerciale della vostra interfaccia utente, come questo si sente come uno stravolgimento del layout automatico per ottenere un modo molto semplice UI. Non so perché si dispone di una vista di scorrimento se si dispone di contenuto "di dimensioni dello schermo" in esso (a meno che non si stesse sfogliando i pulsanti). Non so perché avresti una visualizzazione del contenuto con un singolo elemento al suo interno. Non capisco perché stai usando un pulsante a schermo intero (mi limito a mettere un tocco sulla vista root in quel punto e chiamarlo un giorno).

Suppongo che abbiate buoni motivi per tutto ciò, ma potrebbe essere opportuno eseguire il backup, chiedere qual è l'esperienza utente desiderata e quindi affrontare il problema in modo fresco per vedere se esiste un modo più efficiente per ottenere l'effetto desiderato.

+0

"Non capisco l'intento aziendale della tua interfaccia utente ..." Sto provando a generare automaticamente qualsiasi UI in base alla sua descrizione. Il pulsante nell'esempio potrebbe essere una serie di sottoview e le loro sottoview. In alcuni casi la descrizione dice che una sottoview deve essere ampia come la superview (nessuna larghezza di esplosione). @Rob Grazie mille !!!!!! – Chrizzor

+0

L'altezza della sua dimensione del contenuto era già stata calcolata correttamente nel mio esempio, quindi lo scorrimento verticale funzionava. Stavo cercando un contenuto Dimensione come questa: 'scrollView.contentSize = CGSizeMake (scrollView.frame.size.width,?)'. Per fare ciò, rimuovere tutti i vincoli verticali dall'esempio di @Rob: Lo scorrimento è ancora funzionante e tutte le sottoview possono essere ampie come la vista di scorrimento senza dare loro una larghezza esplicita. – Chrizzor

Problemi correlati