Próbuję to rozgryźć od zeszłego tygodnia, nie idąc dalej. Ok, więc trzeba zastosować pewne ograniczenia programowo w Swift Do UIView
korzystania z tego kodu:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
Ale Xcode zwraca ten dziwny wynik:
2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Możesz mi pomóc? Wielkie dzięki
ios
swift
uiview
autolayout
nslayoutconstraint
Sara Canducci
źródło
źródło
>
. Tym razem to naprawiłem.Odpowiedzi:
Czy planujecie mieć kwadratu
UIView
o szerokości 100 i wysokości 100 wyśrodkowany wewnątrzUIView
odUIViewController
? Jeśli tak, możesz wypróbować jeden z 6 następujących stylów automatycznego układu (Swift 5 / iOS 12.2):1. Za pomocą
NSLayoutConstraint
inicjatora2. Używanie języka formatu wizualnego
3. Używanie kombinacji
NSLayoutConstraint
inicjalizatora i języka formatów wizualnych4. Korzystanie
UIView.AutoresizingMask
Uwaga: Sprężyny i rozpórki zostaną przetłumaczone na odpowiednie ograniczenia układu automatycznego w czasie wykonywania.
5. Korzystanie
NSLayoutAnchor
6. Używanie
intrinsicContentSize
iNSLayoutAnchor
Wynik:
źródło
newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
newView.translatesAutoresizingMaskIntoConstraints = false
części! Zajęło mi to trochę czasu.Pomaga mi się uczyć wizualnie, więc jest to dodatkowa odpowiedź.
Kod bojlera
Każdy z poniższych przykładów jest niezależny od pozostałych.
Przypnij lewą krawędź
myView.leading = leadingMargin + 20
Metoda 1: Styl kotwicy
leadingAnchor
znajduje się równieżtrailingAnchor
,topAnchor
ibottomAnchor
.Metoda 2: Styl NSLayoutConstraint
.leading
znajduje się również.trailing
,.top
i.bottom
..leadingMargin
znajduje się również.trailingMargin
,.topMargin
i.bottomMargin
.Ustaw szerokość i wysokość
width = 200
height = 100
Metoda 1: Styl kotwicy
Metoda 2: Styl NSLayoutConstraint
Centrum w pojemniku
myView.centerX = centerX
myView.centerY = centerY
Metoda 1: Styl kotwicy
Metoda 2: Styl NSLayoutConstraint
Notatki
NSLayoutConstraint
stylem, jednak jest dostępny tylko w systemie iOS 9, więc jeśli obsługujesz system iOS 8, powinieneś nadal używaćNSLayoutConstraint
stylu.myView
w moim projekcie testowym, musiałem mieć cztery ograniczenia.Dalsza lektura
źródło
leading
vs.centerX
addConstraint()
włączenieview
, aby zarejestrować ograniczenia układu.Jeśli chcesz wypełnić swój super widok, sugeruję szybki sposób:
Z drugiej strony, jeśli potrzebujesz nierównomiernych ograniczeń, sprawdź NSLayoutAnchor od iOS 9. Często łatwiej jest to odczytać bezpośrednio przy użyciu NSLayoutConstraint:
źródło
isActive = true
Nie zawsze jest to dobry pomysł. Lepiej i wydajniej jest zgrupować powiązane ograniczenia w jedno i aktywować je wszystkie jednocześnieNSLayoutConstraint.activate
.Ograniczenia dla wielu widoków na placu zabaw.
szybkie 3+
źródło
Problem, jak sugeruje komunikat o błędzie, polega na tym, że masz ograniczenia typu,
NSAutoresizingMaskLayoutConstraints
które są sprzeczne z twoimi wyraźnymi ograniczeniami, ponieważnew_view.translatesAutoresizingMaskIntoConstraints
jest ustawione na true.Jest to ustawienie domyślne dla widoków tworzonych w kodzie. Możesz to wyłączyć w następujący sposób:
Również twoje ograniczenia szerokości i wysokości są dziwne. Jeśli chcesz, aby widok miał stałą szerokość, jest to właściwy sposób:
(Zamień 100 na szerokość, którą chcesz mieć).
Jeśli Twoim celem wdrożenia jest iOS 9.0 lub nowszy, możesz użyć tego krótszego kodu:
W każdym razie, dla takiego układu (stały rozmiar i wyśrodkowany w widoku nadrzędnym) byłoby łatwiej użyć maski automatycznej zmiany rozmiaru i pozwolić systemowi przekształcić maskę w ograniczenia:
Zauważ, że użycie automatycznej zmiany rozmiaru jest całkowicie uzasadnione, nawet jeśli używasz również autolayout. (UIKit nadal korzysta z automatycznej zmiany rozmiaru w wielu miejscach wewnętrznie.) Problem polega na tym, że trudno jest zastosować dodatkowe ograniczenia do widoku korzystającego z automatycznej zmiany rozmiaru.
źródło
Zasadniczo wymagało to 3 kroków
To umieszcza etykietę „witaj świecie” na środku ekranu.
Proszę odnieść się do linku Ograniczenia autoukładu programowo
źródło
Zaktualizowano dla Swift 3
Rodzaj ograniczeń
źródło
Automatyczny układ realizowany jest poprzez zastosowanie ograniczeń na obrazach. Użyj NSLayoutConstraint. Możliwe jest wdrożenie idealnego i pięknego projektu na wszystkich urządzeniach. Wypróbuj poniższy kod.
źródło
jest trochę inaczej w xcode 7.3.1. oto co wymyśliłem
źródło
Chciałbym dodać teoretyczną koncepcję do odpowiedzi Imanou Petit, aby zrozumieć, jak działa automatyczny układ.
Aby zrozumieć układ automatyczny, rozważ swój widok jako obiekt gumy który początkowo się kurczy.
Aby umieścić obiekt na ekranie, potrzebujemy 4 obowiązkowych rzeczy:
Współrzędna X obiektu (pozycja pozioma).
Współrzędna Y obiektu (pozycja pionowa)
Szerokość obiektu
Wysokość obiektu.
1 współrzędna X: Istnieje wiele sposobów podając współrzędne X do widoku.
Takich jak wiązanie wiodące, wiązanie końcowe, wyśrodkowanie w poziomie itp.
Współrzędna 2 Y: Istnieje kilka sposobów dając współrzędnych y w widoku:
Takie jak ograniczenie górne, ograniczenie dolne, środek pionowy itp.
3 Szerokość obiektu: Istnieją dwa sposoby nałożenia ograniczenia szerokości na widok:
za. Dodaj ograniczenie o stałej szerokości (rozważ to ograniczenie jako żelazny pręt o stałej szerokości i zaczepiłeś nim przedmiot gumy poziomo, aby obiekt gumy nie kurczył się ani nie rozszerzał)
b. Nie dodawaj żadnego ograniczenia szerokości, ale dodaj wiązanie współrzędnej x zarówno do końca, jak i do końca, te dwa wiązania rozszerzą / zmniejszą obiekt gumy, pociągając / popychając go z obu końców, prowadząc i kończąc.
4 Wysokość obiektu: Podobnie jak szerokość, istnieją dwa sposoby na ograniczenie wysokości widoku:
za. Dodaj ustalone ograniczenie wysokości (rozważ to ograniczenie jako żelazny pręt o stałej wysokości i zaczepiłeś nim przedmiot gumy pionowo, aby obiekt gumy nie kurczył się ani nie rozszerzał)
b. Nie dodawaj żadnego ograniczenia wysokości, ale dodaj wiązanie współrzędnej x do obu końców widoku u góry iu dołu, te dwa wiązania będą rozszerzać / zmniejszać obiekt gumy, ciągnąc / popychając go z obu stron, z góry iz dołu.
źródło
źródło
Jest to jeden ze sposobów programowego dodawania ograniczeń
źródło
Dodajesz wszystkie zdefiniowane ograniczenia, do
self.view
których jest źle, ponieważ ograniczenie do szerokości i wysokości powinno zostać dodane do twojegonewView
.Ponadto, jak rozumiem, chcesz ustawić stałą szerokość i wysokość 100: 100. W takim przypadku należy zmienić kod na:
źródło
Jeśli uważasz, że powyższe jest brzydkie. Należy rozważyć użycie DSL dla ograniczeń. Jak na przykład SnapKit Sprawia, że interfejs API jest znacznie bardziej przyjazny dla użytkownika
źródło
Możemy to łatwo zrobić w swift 5.1
konfiguracja 1
wysokość widoku podrzędnego ustawiona za pomocą pływaka
konfiguracja 2
szerokość widoku podrzędnego ustawiona za pomocą wysokości widoku
źródło
Wypróbuj to eleganckie
UIView
rozszerzenie dla ograniczeń. Możesz wykonywać ograniczenia w prosty sposób:Oto rozszerzenie, po prostu skopiuj je do swojego projektu.
źródło