В настоящее время нет, не похоже, что можно центрировать вид в суперпредставлении, используя только VFL. Однако это не так сложно сделать, используя одну строку VFL и одно дополнительное ограничение (на ось):
VFL: "|-(>=20)-[view]-(>=20)-|"
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
Можно подумать, что вы просто сможете сделать это (это то, что я изначально думал и пытался, когда я увидел этот вопрос):
[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : view}];
Я пробовал много разных вариантов вышеописанного, пытаясь подчинить его своей воле, но, похоже, это не относится к суперпредставлению, даже если явно иметь две отдельные строки VFL для обеих осей ( H:|V:
). Затем я начал , чтобы попытаться изолировать точно , когда варианты действительно получить применяется к ЛВЖ. По-видимому, они не применяются к суперпредставлению в VFL и будут применяться только к любым явным представлениям, упомянутым в строке VFL (что в некоторых случаях вызывает разочарование).
Я надеюсь, что в будущем Apple добавит какую-то новую опцию, чтобы опции VFL учитывали суперпредставление, даже если это делается только тогда, когда существует только одно явное представление помимо суперпредставления в VFL. Другим решением может быть другой вариант принят в VFL , что говорит что - то вроде: NSLayoutFormatOptionIncludeSuperview
.
Излишне говорить, что я многое узнал о VFL, пытаясь ответить на этот вопрос.
|
и[superview]
как отдельные внутренние объекты, даже если они представляют один и тот же семантический объект. При использовании[superview]
autolayout объект superview включается в его метрику выравнивания (в случае, когда он отвечает по ссылке на github, это метрикаNSLayoutFormatAlignAllCenterY
/X
).Да, можно центрировать представление в его суперпредставлении с помощью языка визуальных форматов. Как вертикально, так и горизонтально. Вот демо:
https://github.com/evgenyneu/center-vfl
источник
Я думаю, что лучше вручную создавать ограничения.
Теперь мы можем использовать NSLayoutAnchor для программного определения AutoLayout:
(Доступно в iOS 9.0 и более поздних версиях)
Я рекомендую использовать SnapKit , который является DSL, чтобы упростить автоматическую компоновку на iOS и MacOS.
источник
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.
Абсолютно возможно было сделать это так:
Узнал это отсюда. Код выше центов subview в виду Y, очевидно.
Swift3:
источник
Добавьте приведенный ниже код и поместите свою кнопку в центр экрана. Абсолютно возможно.
источник
Я знаю, что вы этого не хотите, но вы, конечно, можете рассчитать поля и использовать их для создания строки визуального формата;)
Во всяком случае нет. К сожалению, это невозможно сделать «автоматически» с VFL - по крайней мере, пока.
источник
Благодаря ответу @Evgenii я создаю полный пример в gist:
отцентрируйте красный квадрат вертикально по высоте
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
Вы можете центрировать вид по вертикали, используя VFL (что не совсем интуитивно понятно) или используя ограничения вручную. Кстати, я не могу объединить центр и высоту вместе в VFL, как:
В текущем решении ограничения VFL добавляются отдельно.
источник
Что нужно сделать, так это то, что суперпредставление должно быть объявлено в словаре. Вместо использования
|
вы используете@{@"super": view.superview};
.И
NSLayoutFormatAlignAllCenterX
для вертикальных иNSLayoutFormatAlignAllCenterY
для горизонтальных как варианты.источник
Вы можете использовать дополнительные виды.
Если хотите аккуратнее, тогда
centerXView.hidden = centerYView.hidden = YES;
.PS: я не уверен, что могу назвать дополнительные представления "заполнителями", потому что английский - мой второй язык. Будет оценено, если кто-то скажет мне это.
источник
Для тех, кто пришел сюда для
Interface Builder
решения на основе (Google приводит меня здесь), просто добавьте постоянные ограничения ширины / высоты и выберите подпредставление -> элемент управления перетаскиванием на его суперпредставление -> выберите «центр вертикально / горизонтально в суперпредставлении».источник
Это мой метод
источник
Просто нужно сказать, что вы можете использовать это вместо ограничений:
источник
@ igor-muzyka ответ в Swift 2 :
источник
Вместо использования VFL вы можете легко сделать это в конструкторе интерфейсов. На главной раскадровке Ctrl + клик по представлению, которое вы хотите центрировать. Перетащите на суперпредставление (удерживая Ctrl) и выберите «Центр X» или «Центр Y». Код не нужен.
источник