2015-03-13 7 views
8

NSLayoutConstraint (w iOS 8.0) ma BOOL właściwość o nazwie active co sprawia, że ​​łatwo włączyć/wyłączyć układ ograniczenie powiedział on-the-fly.Włączanie/wyłączanie NSLayoutConstraints w InterfaceBuilder

Aby utworzyć drugi zestaw układu dla kontrolera widoku, który można następnie programowo włączyć/wyłączyć (przez oba zestawy), będę musiał wyłączyć moje już zdefiniowane ograniczenia układu w konstruktorze interfejsów.

Pozwolę sobie wyjaśnić, że NIE chcę ich usuwać, po prostu wyłącz je, aby móc zaprojektować drugi zestaw bez budowniczego interfejsu, narzekającego cały czas na niedopasowania. Ponadto przełączanie klas wielkości nie jest opcją, ponieważ zestawy układów są przeznaczone dla jednej i tej samej klasy wielkości.

Czy jest taka opcja?

Dzięki z góry

Malte

Dalsze informacje: SDK Version: 8.1Deployment Target 8.0

Odpowiedz

18

Wybierz ograniczenie chcesz wyłączyć w serii ujęć, a Option + poleceń + pokazać atrybutów Inspektor, a następnie odznacz opcję Zainstalowane.

+8

Wow, dziękuję, że zadziałało, naprawdę odznaczenie zainstalowanego sprawiłoby, że byłyby niedostępne w tej klasie wielkości! Wielkie dzięki! – Malte

+0

W Xcode 8 musisz zaznaczyć opcję "Użyj zmiany cechy", aby ją włączyć. –

+0

@AmmarMujeeb Gdzie to robisz? – shim

10

Użyłem wcześniej rozwiązania dostarczonego przez Gabblera, ale ostatnio wypróbowałem to samo, używając Swift 2.0 i Xcode 7 i odkryłem, że już nie działa. Ograniczenia, które zostały ustawione jako niezainstalowane, były, jak można się było spodziewać, nie były instalowane w ogóle i nie miały wpływu na układ po włączeniu lub wyłączeniu.

Rozwiązaniem tego problemu było upewnienie się, że wszystkie ograniczenia zostały zainstalowane i dodanie zdefiniowanego przez użytkownika atrybutu środowiska wykonawczego z kluczem "aktywny", typem "boolean" i wartością "false".

Zdefiniowany przez użytkownika panel atrybutów środowiska wykonawczego można znaleźć w oknie Inspektor tożsamości pod polami klasy niestandardowej.

+0

Przyjemna praca. Jednak nadal wszystkie ostrzeżenia i błędy programu budującego interfejs są powiązane z konfliktowymi ograniczeniami. Zastanawiam się, dlaczego nie ma tu pola wyboru aktywnego atrybutu, który rozwiązałby ten problem. – bjornorri

+1

Tak, to nie jest szczególnie przyjemne, ale nie znam rozwiązania w pełni zgodnego z IB. Mam nadzieję, że przyszła wersja Xcode rozpozna potrzebę tego ustawienia. – Ash

+1

Zawsze można ustawić priorytet wiązania oznaczonego jako nieaktywny na 9999, aby wyciszyć ostrzeżenia. – bencallis

0

Moje rozwiązanie używając Xcode 8 i Swift 3 bez uzyskiwania jakichkolwiek ostrzeżeń została niezaznaczone na Zainstalowana pole na interfejsie Builder, kartę inspektora:

Installed box on Interface builder

następnie utworzyć IBOutlets i dodaj/usuń je programowo na viewDidLayoutSubviews()

view.removeConstraints([constraints to remove, ...]) 
view.addConstraints([constraints to add, ...]) 

upewnij się, aby usunąć ograniczenia pierwsze, inaczej otrzymasz dziennik wiadomości Nie można jednocześnie spełnić ograniczeń ...