2013-02-20 13 views
21

Mam widok iOS z włączonym autolayout i UIToolbar z UISearchBar i UISegmentControl zawartym na pasku narzędzi. Chcę, aby UISearchBar miał elastyczną szerokość, więc muszę dodać ograniczenie, aby wymusić to, ale z tego, co mogę powiedzieć, nie można dodawać ograniczeń do elementów w UIToolbar w Konstruktorze interfejsu. Wszystkie opcje są wyłączone.Autoukład iOS i UIToolbar/UIBarButtonItems

Przed AutoLayout osiągnęłabym to dzięki autoresizingmasks.

Czy ograniczenia są niedozwolone w ramach UIToolbars/UINavigationBars?

Jak inaczej można to osiągnąć, korzystając z autolayout?

+0

zrobiłem kilka rzeczy, jak to już wcześniej, chociaż zasadniczo czekam tylko na zmianę wielkości widoku, a następnie odpowiednio zaktualizuję ramkę widoku docelowego. To zawsze jest opcja, jeśli okaże się, że nie ma sposobu, aby zrobić to automagicznie. – Brian

+0

czy możesz opublikować zdjęcie? –

+0

Chciałbym, ale skończyło się porzucenie AutoLayout i powrót do korzystania z maski autouzupełniania. Działa świetnie przy użyciu tego modelu. – outerstorm

Odpowiedz

23

Ograniczenia autolayout działają tylko z UIViews i ich podklasami.

Podczas UIToolbar umożliwia pewne elementy oparte UIView (takie jak UISearchBar i UISegmentedControl) mogą one muszą współistnieć z UIBarButtonItems które nie dziedziczą z UIView.

Dopóki autolayout nie zadziała z UIBarButtonItems, wykonaj to, co zrobiłeś.

Alternatywą jest zwijanie własnego paska narzędzi z widżetami opartymi tylko na UIViews.

+4

Czy jest jakiś pomysł, czy Apple pracuje nad rozwiązaniem tego problemu? To buga mnie, że niespójność zostanie zerwana, jeśli będę musiał używać AL i starego podejścia w różnych miejscach ... – Petar

7

Możesz to zrobić przynajmniej w kodzie; Jestem typem, który porzucił program budujący interfejs i mimo to wykonał go w kodzie. IB wydaje się wchodzić mi w drogę częściej, gdy chodzi o dodawanie lub podkręcanie ograniczeń. Oto, co zrobiłem w mojej niestandardowej metodzie podklasy.

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

A ponieważ lubię leniwy obciążenia jak najwięcej, oto moja self.label instancja zmiennej (tzw kiedy [self addSubview:self.label] dostaje messaged powyżej).

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

Wydaje się, że pracujesz dla mnie. Nie dodaję jednak żadnego UIBarButtonItems, więc twój przebieg się zmienia.

+0

Jeśli próbujesz zmienić położenie istniejącego paska narzędzi za pomocą więzów, znajdziesz bardzo przydatne ograniczenie NSLayoutAttributeCenterX. – russes

8

Można to również zrobić bezpośrednio z storyboardu.

Wystarczy przeciągnąć i upuścić elementy na pasku narzędzi, a niektóre z nich zamienić w elastyczne lub ustalone miejsce, aby uzyskać pożądany efekt. Zobacz dwa przykłady poniżej.

Evenly spaced

Centered

Uwaga: jest to kopia mojej odpowiedzi do Aligning UIToolBar items, ja stumbbled na oba pytania podczas poszukiwania takiego rozwiązania