программно изменить выравнивание UIStackView не работает должным образом

Что у меня есть:

Это моя иерархия взглядов:

  • кнопка с именем b1, у которой есть действие с именем «changeAlignment», которое активируется при касании внутри.
  • an UIView named Pview with frame (0,100,414,100).
    • an horizontal UIStackView named S1, with the alignment property set as "center". This stackView has been pinned to the borders of pView.
      • an horizontal UIStackView named S2, with the alignment property set as "Fill" and which has inside two labels.

Что я хочу сделать:

Я хочу изменить выравнивание S1 с «Центра» на «Верх», когда я касаюсь кнопки b1.

Что я пробовал

- (void) changeAlignment {
  NSLog(@"P-%li",(long)S1.alignment);
  S1.alignment = UIStackViewAlignmentTop;
  NSLog(@"P-%li",(long)S1.alignment);
  [pView layoutIfNeeded];
}

Это звучит очевидно, но это не работает!!. Самое смешное, что когда-то он работал, но вдруг переставал работать. Теперь, когда я нажимаю b1, выравнивание S1 меняется, но визуально оно не меняется вообще.

Я пробовал с [self.view setNeedsLayout] [self.view layoutIfNeeded] и даже [S1 layoutIfNeeded], и ничего из этого не работает.

Что я делаю не так??..Как вообще возможно, что он на самом деле работает и вдруг перестает работать!!??

Кто-нибудь может мне помочь??... это сводит меня с ума.


person Airel    schedule 16.02.2017    source источник
comment
@coverback не могли бы вы помочь мне решить эту проблему ??   -  person Airel    schedule 02.03.2017


Ответы (1)


Я думаю, что ответ на это такой же, как и в Как программно анимировать свойство выравнивания UIStackView в ios 9.

Объяснение такого поведения заключается в следующем: (1) stackView автоматически генерирует ограничения, необходимые для компоновки его упорядоченных подпредставлений, (2) определение горизонтального stackview S1 с другим stackView S2 в качестве упорядоченного подвида S1, заставляет S1 создайте некоторые ограничения, которые (a) не затрагиваются, (b) не пересчитываются или (c) пересчитываются, но остаются прежними, когда вы изменяете свойство выравнивания S1 с Center на Top и наоборот. Таким образом, поскольку автоматически сгенерированные ограничения S1 не затрагиваются или вообще не меняются после изменения свойства выравнивания, пользовательский интерфейс не отражает никаких изменений, а также отсутствует анимация. Если кто-то придумал другое объяснение, дайте мне знать.

person Airel    schedule 09.03.2017