2012-12-12 13 views
5

Sto provando a costruire una vista che avrà diversi controlli diversi, ma voglio che la vista scorra solo nella direzione verticale. Sto usando il layout automatico, quindi non voglio dover specificare manualmente la dimensione (so che posso farlo, ma da quello che ho capito in base alle note di rilascio su UIScrollView non dovresti farlo).Come utilizzare UIScrollView con AutoLayout (iOS6)?

Quindi, se creo un semplice controller di visualizzazione (senza file .xib) e aggiungo semplicemente il metodo seguente al metodo init, mi aspetto che le mie etichette si sposino (cosa che fanno) e che la mia vista scenda verticalmente, tuttavia, questo non è il caso:

- (id)init { 
    self = [super init]; 
    if (self) { 

     UIScrollView *_scrollView = [UIScrollView new]; 
     [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

     UILabel *label1 = [UILabel new]; 
     UILabel *label2 = [UILabel new]; 

     [label1 setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [label2 setTranslatesAutoresizingMaskIntoConstraints:NO]; 

     [label1 setNumberOfLines:0]; 
     [label2 setNumberOfLines:0]; 

     [label1 setPreferredMaxLayoutWidth:240]; 
     [label2 setPreferredMaxLayoutWidth:240]; 

     NSString *sampleText = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."; 
     [label1 setText:sampleText]; 
     [label2 setText:sampleText]; 

     [self.view addSubview:_scrollView]; 
     [_scrollView addSubview:label1]; 
     [_scrollView addSubview:label2]; 

     NSArray *constraints; 
     constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_scrollView)]; 
     [self.view addConstraints:constraints]; 

     constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_scrollView)]; 
     [self.view addConstraints:constraints]; 

     constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label1]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1)]; 
     [_scrollView addConstraints:constraints]; 

     constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label2]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label2)]; 
     [_scrollView addConstraints:constraints]; 

     constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)]; 
     [_scrollView addConstraints:constraints]; 
    } 

    return self; 
} 

ci sono diversi risultati di questo codice che penso siano dispari. Se si registra la scrollviewheight nel metodo viewDidLayoutSubviews (dopo la super-chiamata), che è dove devono essere applicati tutti i vincoli, l'altezza sta riportando 0. Ciò che è strano è che la larghezza sta riportando un numero diverso da quello che mi aspetterei. Mi aspetterei che riportasse la larghezza della superview a causa del primo vincolo (ho persino provato a forzare la larghezza all'interno di quel vincolo con una priorità che è presumibilmente richiesta ma che comunque non ha funzionato).

A quanto ho capito, la dimensione del contenuto dello UIScrollView deve essere impostata in base alle dimensioni intrinseche del suo contenuto, ma ciò non sembra avvenire.

Quindi, qualcuno sa cosa manca?

+0

+1 per l'origine di lorem ipsum) – Stas

risposta

9

Ho contattato l'assistenza Apple per ottenere una risposta alla mia domanda. Il problema con il codice è che gli oggetti contenuti all'interno di UIScrollView devono essere bloccati verticalmente sia in alto che in basso per determinare la dimensione intrinseca del contenuto. Così la seguente riga di codice dovrebbe essere modificata per

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)]; 
[_scrollView addConstraints:constraints]; 

:

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)]; 
[_scrollView addConstraints:constraints]; 

Essi hanno inoltre sottolineato che stavo usando la "nuova" parola chiave su diversi oggetti in cui la base "Init" è non l'inizializzatore designato. Pur non avendo nulla a che fare con il mio problema specifico, hanno fatto notare che dovresti evitare di farlo perché il tuo oggetto potrebbe trovarsi in uno stato non valido.

+0

Adam potresti essere più specifico riguardo la risposta della mela sul nuovo metodo - hanno detto che dovremmo evitare di usarlo? – Stas

+2

@Stas http://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new-objective-c –

Problemi correlati