2013-02-20 13 views
21

Ich habe eine iOS-Ansicht mit Autolayout aktiviert und haben eine UIToolbar mit einer UISearchBar und UISegmentControl mit der Symbolleiste enthalten. Ich möchte, dass die UISearchBar eine flexible Breite hat, also muss ich eine Einschränkung hinzufügen, um dies zu erzwingen, aber von dem, was ich Ihnen sagen kann, können Sie keine Einschränkungen zu Elementen in einem UIToolbar in Interface Builder hinzufügen. Die Optionen sind alle deaktiviert.iOS Autolayout und UIToolbar/UIBarButtonItems

Vor AutoLayout würde ich dies mit autoresizingmasks erreichen.

Sind Einschränkungen innerhalb UIToolbars/UINavigationBars nicht zulässig?

Wie kann dies sonst bei Verwendung von Auto-Layout erreicht werden?

+0

ich ein paar Sachen wie diese vorher getan haben, obwohl ich im Grunde nur darauf warte, dass sich die Größe der Ansicht ändert und dann den Rahmen der Zielansicht entsprechend aktualisiert. Das ist immer eine Option, wenn sich herausstellt, dass es keinen automatischen Weg gibt. – Brian

+0

könnten Sie ein Bild posten? –

+0

Ich würde, aber ich landete AutoLayout und gehen zurück zu Autoresizingmasks verwenden. Es funktioniert großartig mit diesem Modell. – outerstorm

Antwort

23

Autolayout-Einschränkungen funktionieren nur mit UIViews und deren Unterklassen.

Während UIToolbar erlaubt einige UIView basierte Elemente (wie UISearchBar und UISegmentedControl) können sie mit UIBarButtonItems koexistieren müssen, die von UIView erben nicht.

Bis das automatische Layout mit UIBarButtonItems arbeiten kann, tun Sie wie Sie getan haben.

Ihre Alternative besteht darin, eine eigene Symbolleiste mit Widgets zu erstellen, die nur auf UIViews basiert.

+4

Irgendeine Idee, wenn Apple daran arbeitet, dies zu lösen? Es stört mich, dass Inkonsistenz gebrochen ist, wenn ich AL und den alten Ansatz an verschiedenen Stellen verwenden muss ... – Petar

7

Sie können dies zumindest im Code tun; Ich bin der Typ, der Interface Builder verlässt und es trotzdem in Code geht. IB scheint mir immer häufiger in die Quere zu kommen, wenn es darum geht, Constraints hinzuzufügen oder zu optimieren. Hier ist, was ich in meiner benutzerdefinierten UIToolbar Unterklasse -initWithFrame: Methode gemacht habe.

- (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; 
} 

Und da ich zu faul Last gerne so viel wie möglich, hier ist mein self.label Instanzvariable (aufgerufen, wenn [self addSubview:self.label] oben messaged wird).

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

Scheint für mich zu arbeiten. Ich gebe keine UIBarButtonItems, obwohl, so dass Ihre Meilenzahl variieren.

+0

Wenn Sie versuchen, eine vorhandene Symbolleiste mithilfe von Einschränkungen neu zu positionieren, finden Sie die NSLayoutAttributeCenterX-Einschränkung sehr nützlich. – russes

8

Dies kann auch direkt von einem Storyboard durchgeführt werden.

Ziehen Sie einfach Elemente in die Symbolleiste, und drehen Sie sie in flexiblen oder festen Abstand, um den gewünschten Effekt zu erzielen. Siehe die beiden folgenden Beispiele.

Evenly spaced

Centered

NB: Dies ist eine Kopie meiner Antwort auf Aligning UIToolBar items, stumbbled ich auf beide Fragen während der Suche nach einer solchen Lösung

Verwandte Themen