Представление, выложенное вручную, в суперпредставлении с автоматической компоновкой

У меня не совсем обычная проблема, связанная с смешиванием Auto Layout и Manual layout.

  1. view1 — суперпредставление, в котором используется автоматический макет.
  2. view2 — подпредставление, в котором используется макет вручную.

Высота view1 зависит от общей высоты подвидов.

Я установил translatesAutoresizingMaskIntoConstraints = NO и frame для представления2 и добавил его в качестве подпредставления к представлению1 . Результирующая высота view2 равна 0 (в layoutSubviews)

Таким образом, автоматическая компоновка view1 не обращает внимания на высоту view2 при определении собственной высоты. А затем распространите эту высоту 0 на view2.

Нужен совет. Я не уверен, что это законно.


person Gladkov_Art    schedule 05.02.2016    source источник
comment
Вы не опубликовали много кода в своем ответе, поэтому у меня есть несколько общих комментариев. Вы можете смешивать представления, созданные с помощью Interface Builder, и представления, созданные программным путем. Есть несколько способов сделать это, но я думаю, что самый простой способ — с помощью Visual Format Language. Этот учебник является хорошей отправной точкой. raywenderlich.com/110393/   -  person Adrian    schedule 05.02.2016
comment
Как могут быть смешанные представления, созданные программно, но с разными механизмами компоновки? Не так много туториалов в гугле :(   -  person Gladkov_Art    schedule 05.02.2016
comment
Не уверен, что код здесь будет уместен, но могу нарисовать схему, если мое описание недостаточно понятно.   -  person Gladkov_Art    schedule 05.02.2016
comment
Как вы сказали superview size equals для subview size, как ОС узнает о зависимости между SuperView (View1) и подвидом (view2) без указания автомакета?   -  person Rafeek    schedule 05.02.2016
comment
super view создает ограничения с 0 константами для верхнего/нижнего/заднего/переднего края подвида. Таким образом, его размер зависит от размера подпредставления, размер которого определяется с помощью ручного макета (установите frame)   -  person Gladkov_Art    schedule 05.02.2016
comment
как вы сказали, вы дали frame для подвида. и translatesAutoresizingMaskIntoConstraints = NO, то как SuperView найдет width и height   -  person Rafeek    schedule 05.02.2016
comment
Обычно frame назначается во время выполнения, либо попытка layoutSubviews может решить вашу проблему. Лучше задавать ограничения программно.   -  person Rafeek    schedule 05.02.2016
comment
@Rafeek, спасибо, я думаю, вы показали мне, как понять проблему. Я установил ограничение по высоте для view2, прежде чем вставлять его в view1 в качестве подвида. Пожалуйста, создайте ответ с вашими последними 2 комментариями, я приму его.   -  person Gladkov_Art    schedule 05.02.2016


Ответы (1)


В мире автоматической компоновки представление должно иметь однозначный набор ограничений. Таким образом, чтобы встроить представление, созданное с помощью ручного макета, в представление, созданное с использованием автоматического макета, либо вы, либо система iOS должны предоставить соответствующий набор ограничений для подпредставления.

Другими словами:

  • установите translatesAutoresizingMaskIntoConstraints = YES, настройте frame и autoresizingMask как обычно. Но обратите внимание на возможные конфликты между ограничениями, которые уже есть у super view, и ограничениями, которые будут созданы операционной системой во время преобразования маски автоматического изменения размера в ограничения (во время выполнения).

  • установите translatesAutoresizingMaskIntoConstraints = NO и добавьте ограничения самостоятельно.

Ну ничего нового. Но мне пришлось потратить некоторое время, чтобы понять это в своей голове, и надеюсь, что это сэкономит ваше время!

person Gladkov_Art    schedule 08.02.2016