Obecnie nie, nie wygląda na to, aby można było wyśrodkować widok w superviewie używając tylko VFL. Nie jest to jednak trudne do zrobienia przy użyciu pojedynczego ciągu VFL i jednego dodatkowego ograniczenia (na oś):
VFL: "|-(>=20)-[view]-(>=20)-|"
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
Można by pomyśleć, że po prostu byłbyś w stanie to zrobić (o czym początkowo myślałem i próbowałem, gdy zobaczyłem to pytanie):
[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : view}];
Próbowałem wielu różnych wariantów powyższego, próbując nagiąć to do mojej woli, ale wydaje się, że nie ma to zastosowania do superwizji, nawet jeśli jawnie mam dwa oddzielne ciągi VFL dla obu osi ( H:|V:
). I wtedy zaczął próbować izolować kiedy dokładnie opcje mają się stosować do VFL. Wydaje się, że nie mają one zastosowania do superviewu w VFL i będą miały zastosowanie tylko do wszelkich wyraźnych poglądów, które są wymienione w ciągu VFL (co jest rozczarowujące w niektórych przypadkach).
Mam nadzieję, że w przyszłości Apple doda jakąś nową opcję, aby opcje VFL uwzględniały superview, nawet jeśli robią to tylko wtedy, gdy istnieje tylko jeden wyraźny widok oprócz superview w VFL. Innym rozwiązaniem mogłoby być innej opcji przeszedł do VFL, który mówi coś takiego: NSLayoutFormatOptionIncludeSuperview
.
Nie trzeba dodawać, że wiele się nauczyłem o VFL, próbując odpowiedzieć na to pytanie.
|
i[superview]
jako oddzielne jednostki wewnętrzne, mimo że reprezentują ten sam obiekt semantyczny. Używając[superview]
autolayout, włącza obiekt superview do swoich metryk wyrównania (w przypadku, gdy w odpowiedzi na link github, jest toNSLayoutFormatAlignAllCenterY
/X
metryka).Tak, można wyśrodkować widok w jego nadzorze za pomocą języka formatu wizualnego. Zarówno w pionie, jak iw poziomie. Oto demo:
https://github.com/evgenyneu/center-vfl
źródło
Myślę, że lepiej jest ręcznie tworzyć ograniczenia.
Teraz możemy użyć NSLayoutAnchor do programowego zdefiniowania AutoLayout:
(Dostępne w iOS 9.0 i nowszych wersjach)
Polecam używanie SnapKit , który jest DSL, aby ułatwić Auto Layout zarówno w systemie iOS, jak i macOS.
źródło
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Absolutnie możliwe udało się to zrobić w ten sposób:
Nauczyłem się tego stąd. Kod powyżej centrów jest oczywiście widoczny w widoku Y.
Swift3:
źródło
Dodaj poniższy kod i umieść przycisk na środku ekranu. Absolutnie możliwe.
źródło
Wiem, że nie chcesz, ale możesz oczywiście obliczyć marginesy i użyć ich do stworzenia wizualnego ciągu formatu;)
W każdym razie nie. Niestety nie jest możliwe zrobienie tego „automatycznie” z VFL - przynajmniej na razie.
źródło
Dzięki odpowiedzi od @Evgenii tworzę pełny przykład w skrócie:
wyśrodkuj czerwony kwadrat w pionie z niestandardową wysokością
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
Możesz wyśrodkować widok w pionie, używając VFL (co nie jest całkiem intuicyjne) lub ręcznie, używając ograniczeń. Nawiasem mówiąc, nie mogę łączyć razem środka Y i wysokości w VFL, jak:
W obecnym rozwiązaniu ograniczenia VFL są dodawane oddzielnie.
źródło
To, co trzeba zrobić, to zadeklarować superwiew w słowniku. Zamiast używać
|
, używasz@{@"super": view.superview};
.I
NSLayoutFormatAlignAllCenterX
dla pionowego iNSLayoutFormatAlignAllCenterY
poziomego jako opcje.źródło
Możesz użyć dodatkowych widoków.
Jeśli chcesz, żeby to było schludne, to
centerXView.hidden = centerYView.hidden = YES;
.PS: Nie jestem pewien, czy mogę nazwać dodatkowe widoki „symbolami zastępczymi”, ponieważ angielski jest moim drugim językiem. Będziemy wdzięczni, jeśli ktoś mi to powie.
źródło
Dla tych, którzy przyszli tutaj po
Interface Builder
rozwiązanie bazowe (Google prowadzi mnie tutaj), po prostu dodaj stałe ograniczenia szerokości / wysokości i wybierz widok podrzędny -> przeciągnij kontrolkę do jego superview -> wybierz „wyśrodkuj pionowo / poziomo w superviewie”.źródło
To jest moja metoda
źródło
Wystarczy powiedzieć, że możesz użyć tego zamiast ograniczeń:
źródło
@ igor-muzyka answer w Swift 2 :
źródło
Zamiast używać VFL, możesz to łatwo zrobić w kreatorze interfejsów. W głównej serii ujęć naciśnij klawisz Ctrl i kliknij widok, który chcesz wyśrodkować. Przeciągnij do Superview (trzymając ctrl) i wybierz „Center X” lub „Center Y”. Nie potrzeba żadnego kodu.
źródło