2013-02-20 12 views
21

Ho una vista iOS con l'autolayout abilitato e un UIToolbar con un UISearchBar e UISegmentControl contenuto nella barra degli strumenti. Voglio che lo UISearchBar abbia una larghezza flessibile, quindi ho bisogno di aggiungere un vincolo per forzare questo, ma da quello che posso dire non è possibile aggiungere vincoli agli elementi in un UIToolbar in Interface Builder. Le opzioni sono tutte disabilitate.Autolayout iOS e UIToolbar/UIBarButtonItems

Prima del AutoLayout Lo farei con autoresizingmasks.

I vincoli non sono consentiti entro UIToolbars/UINavigationBars?

In quale altro modo è possibile eseguire questa operazione quando si utilizza l'autolayout?

+0

Ho fatto alcune cose del genere prima, anche se in pratica sto solo aspettando che le dimensioni della vista cambino e quindi aggiorno il frame della vista di destinazione di conseguenza. Questa è sempre un'opzione se si scopre che non esiste un modo per farlo in modo automatico. – Brian

+0

potresti pubblicare un'immagine? –

+0

Vorrei, ma ho finito per abbandonare AutoLayout e tornare a utilizzare le maschere di autoresizing. Funziona alla grande usando quel modello. – outerstorm

risposta

23

I vincoli di Autolayout funzionano solo con UIViews e le relative sottoclassi.

Mentre UIToolbar permette alcuni UIView elementi in base (come ad esempio UISearchBar e UISegmentedControl) che possono avere a coesistere con UIBarButtonItems che non eredita da UIView.

Fino a quando l'intervallo automatico può funzionare con UIBarButtonItems, fare come si è fatto.

L'alternativa è quella di eseguire il rollover della barra degli strumenti con widget basati solo su UIViews.

+4

Qualche idea se Apple sta lavorando per risolvere questo problema? Mi infastidisce che l'incoerenza si rompa se devo usare AL e il vecchio approccio in posti diversi ... – Petar

7

È possibile farlo in codice, almeno; Sono il tipo per abbandonare Interface Builder e andare comunque nel codice. IB sembra intromettersi molto spesso quando si tratta di aggiungere o modificare i vincoli. Ecco cosa ho fatto nel mio metodo -initWithFrame: della sottoclasse personalizzata.

- (instancetype)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     [self addSubview:self.label]; 

     [self addConstraint:[NSLayoutConstraint 
          constraintWithItem:self.label 
          attribute:NSLayoutAttributeCenterX 
          relatedBy:NSLayoutRelationEqual 
          toItem:self 
          attribute:NSLayoutAttributeCenterX 
          multiplier:1 constant:0]]; 
     [self addConstraint:[NSLayoutConstraint 
          constraintWithItem:self.label 
          attribute:NSLayoutAttributeCenterY 
          relatedBy:NSLayoutRelationEqual 
          toItem:self 
          attribute:NSLayoutAttributeCenterY 
          multiplier:1 constant:0]]; 
    } 
    return self; 
} 

E dato che mi piace di carico pigri, per quanto possibile, ecco la mia variabile self.label esempio (chiamato quando [self addSubview:self.label] ottiene messaged sopra).

- (UILabel *)label { 
    if (_label) return _label; 
    _label = [UILabel new]; 
    _label.translatesAutoresizingMaskIntoConstraints = NO; 
    _label.textAlignment = NSTextAlignmentCenter; 
    return _label; 
} 

Sembra funzionare per me. Non sto aggiungendo alcun UIBarButtonItems, quindi, il mio chilometraggio è diverso.

+0

Se stai provando a riposizionare una barra degli strumenti esistente usando i vincoli, troverai che il vincolo NSLayoutAttributeCenterX è molto utile. – russes

8

Questo può anche essere fatto direttamente da uno storyboard.

Basta trascinare e rilasciare elementi nella barra degli strumenti e trasformarne alcuni in uno spazio flessibile o fisso per ottenere l'effetto desiderato. Vedi i due esempi qui sotto.

Evenly spaced

Centered

NB: questa è una copia della mia risposta a Aligning UIToolBar items, ho stumbbled su entrambe le domande durante la ricerca di una soluzione del genere