Utworzyłem dwa widoki w jednym superviewie, a następnie dodałem ograniczenia między widokami:
_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];
_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];
[self addConstraint:_indicatorConstrainWidth];
[self addConstraint:_indicatorConstrainHeight];
Teraz chcę zmienić właściwość mnożnika za pomocą animacji, ale nie mogę dowiedzieć się, jak zmienić właściwość mnożnika. (Znalazłem _coefficient we własności prywatnej w pliku nagłówkowym NSLayoutConstraint.h, ale jest to prywatne.)
Jak zmienić właściwość mnożnika?
Moje obejście polega na usunięciu starego ograniczenia i dodaniu nowego z inną wartością dla multipler
.
ios
iphone
objective-c
nslayoutconstraint
Bimawa
źródło
źródło
Odpowiedzi:
Jeśli masz tylko dwa zestawy mnożników, które należy zastosować, od iOS8 możesz dodać oba zestawy ograniczeń i zdecydować, które powinny być aktywne w dowolnym momencie:
Wersja Swift 5.0
źródło
addConstraint(_:)
iremoveConstraint(_:)
poglądu, który jest najbliższym wspólnym przodkiem elementów zarządzanych przez to ograniczenie”.Oto rozszerzenie NSLayoutConstraint w Swift, które sprawia, że ustawienie nowego mnożnika jest całkiem łatwe:
W Swift 3.0+
Użycie wersji demonstracyjnej:
źródło
NSLayoutConstraint.deactivateConstraints([self])
należy to zrobić przed utworzeniemnewConstraint
, w przeciwnym razie może to spowodować ostrzeżenie: Nie można jednocześnie spełnić ograniczeń .newConstraint.active = true
Jest również niepotrzebne, ponieważNSLayoutConstraint.activateConstraints([newConstraint])
robi dokładnie to samo.cloneWithMultiplier
aby była bardziej wyraźna, że nie tylko stosuje efekty uboczne, ale raczej zwraca nowe ograniczenie0.0
, nie będziesz mógł go ponownie zaktualizować.Plik
multiplier
Właściwość jest tylko do odczytu. Musisz usunąć stary NSLayoutConstraint i zastąpić go nowym, aby go zmodyfikować.Ponieważ jednak wiesz, że chcesz zmienić mnożnik, możesz po prostu zmienić stałą, mnożąc ją samodzielnie, gdy potrzebne są zmiany, co często jest mniejszą ilością kodu.
źródło
View2.bottomY
„s aktualną wartość do obliczenia ograniczenie w nowej stałej. Jest to wadliwe, ponieważView2.bottomY
stara wartość zostanie upieczona w stałej, więc musisz zrezygnować z deklaratywnego stylu i ręcznie aktualizować ograniczenie w dowolnym momencieView2.bottomY
. W takim przypadku możesz również wykonać układ ręczny.Funkcja pomocnicza, której używam do zmiany mnożnika istniejącego ograniczenia układu. Tworzy i aktywuje nowe ograniczenie i dezaktywuje stare.
Użycie, zmiana mnożnika na 1,2:
źródło
NSLayoutConstraint.deactivate
działa tylko w systemie iOS 8.0+.Wersja Objective-C dla odpowiedzi Andrew Schreibera
Utwórz kategorię dla klasy NSLayoutConstraint i dodaj metodę w pliku .h w ten sposób
W pliku .m
Później w ViewController utwórz wylot dla ograniczenia, które chcesz zaktualizować.
i zaktualizuj mnożnik, gdzie chcesz, jak poniżej.
źródło
active = true
jest taka sama jak aktywacja i dlatego powoduje dodanie zduplikowanego ograniczenia przed wywołaniem dezaktywacji, co powoduje błąd ograniczeń w niektórych scenariuszach.Zamiast tego można zmienić właściwość „stała”, aby osiągnąć ten sam cel za pomocą odrobiny matematyki. Załóżmy, że domyślny mnożnik ograniczenia wynosi 1,0f. To jest kod Xamarin C #, który można łatwo przetłumaczyć na Objective-c
źródło
Jak w innych wyjaśnieniach: Musisz usunąć ograniczenie i utworzyć nowe.
Możesz uniknąć zwracania nowego ograniczenia, tworząc metodę statyczną dla
NSLayoutConstraint
zinout
parametrem, która umożliwia ponowne przypisanie przekazanego ograniczeniaPrzykładowe użycie:
źródło
ŻADEN Z POWYŻSZEGO KODU NIE DZIAŁAŁ DLA MNIE TAK PO PRÓBIE ZMIANY MÓJ WŁASNEGO KODU TEN KOD Ten kod działa w Xcode 10 i szybkim 4.2
źródło
Tak, możemy zmienić wartości mnożnika, po prostu utwórz rozszerzenie NSLayoutConstraint i użyj go jak ->
źródło
Przełącz, zmieniając aktywne ograniczenie w kodzie, jak sugeruje wiele innych odpowiedzi, nie działa dla mnie. Utworzyłem więc 2 ograniczenia, jedno zainstalowane, a drugie nie, powiąż oba z kodem, a następnie przełącz się, usuwając jedno i dodając drugie.
Dla kompletności, aby związać ograniczenie, przeciągnij ograniczenie do kodu za pomocą prawego przycisku myszy, tak jak każdy inny element graficzny:
Nazwałam jedną proporcjęIPad, a drugą proporcjęIPhone.
Następnie dodaj następujący kod w viewDidLoad
Używam xCode 10 i Swift 5.0
źródło
Oto odpowiedź oparta na odpowiedzi @ Tianfu w C #. Inne odpowiedzi, które wymagają aktywacji i dezaktywacji ograniczeń, nie działały w moim przypadku.
źródło
Aby zmienić wartość mnożnika, wykonaj następujące kroki: 1. utwórz wyloty dla wymaganego ograniczenia, np. SomeConstraint. 2. Zmień wartość mnożnika, np. SomeConstraint.constant * = 0.8 lub dowolną wartość mnożnika.
to wszystko, miłego kodowania.
źródło
Można przeczytać:
na tej stronie dokumentacji . Czy to nie oznacza, że należy umieć modyfikować mnożnik (ponieważ jest to zmienna)?
źródło
var multiplier: CGFloat { get }
to definicja, która oznacza, że ma tylko element pobierający.