2014-12-10 3 views
0

Внутри диспетчера представлений меню боковой панели (на основе SWRevealViewController) я использую две таблицы для имитации двух столбцов. Поэтому, когда пользователь нажимает на опцию с дополнительными опциями, другой контроллер табличного представления загружает их. (См изображение)Анимация UITableView Width Constraint

An option with sub-options

Теперь проблема заключается в том, что не все опции в первой таблице на самом деле имеет подопции. Таким образом, мне нужно анимировать первую таблицу (таблица с основными опциями), поэтому она должна иметь полную ширину супервизора , когда нет подпозиций для отображения с другой стороны. Только нажатие на опцию, которая имеет подпараметры, должна анимировать ширину, чтобы оба столбца отображались бок о бок. (См Images)

(Слева: Целевое поведение, справа: Текущее поведение)

Intended behaviour current behaviour

Логика для отображения дополнительных параметров и перезагрузки таблицы сделаны, и это работает прекрасно. Единственная проблема, с которой я сталкиваюсь, - это анимация. Чтобы оживить ширину таблицы, я подумал о настройке автоматической компоновки для ярлыков внутри ячеек следующим образом: H:|-8-Label-8-|, V:|-8-Label-8-| и для обеих таблиц: H:|LeftTable(LeftTableWidth)-0-RightTable| с созданием розетки для ограничения LeftTableWidth. Поэтому, когда мне нужно, чтобы оживить их, я это сделать:

[self.view layoutIfNeeded]; 
self.subTableWidthConstraint.constant = width; 
[UITableView animateWithDuration:0.45f 
       animations:^{ 
        [self.view layoutIfNeeded]; 
       }]; 

Теперь ширины таблиц становятся правильно анимированные. Однако метки внутри ячеек не анимируются от начальных значений ширины до конечных значений. Вместо этого их новые значения сразу же устанавливаются, когда изменяется ограничение (до того, как таблицы завершат их анимацию). Я даже попытался удалить все, кроме:

self.subTableWidthConstraint.constant = width; 

и они до сих пор получить их новые значения, даже не называют [self.view updateConstraints].

Итак ... какие-нибудь подсказки, что я сделал не так? Спасибо всем!

ответ

0

Только что понял! Поскольку я использую RTL-язык, мне нужно было установить режим меток на Right вместо значения по умолчанию Left. enter image description here

0

У меня такая же проблема с анимацией - layoutIfNeeded для всех связанных с анимацией представлений в блоке анимации помогает мне.

self.subTableWidthConstraint.constant = width; 
[self.subTable setNeedsUpdateConstraints]; 
[UITableView animateWithDuration:0.45f 
              animations:^{ 
               [self.subTable layoutIfNeeded]; 
               [self.mainTable layoutIfNeeded]; 
               [self.view layoutIfNeeded]; 
              }]; 
+0

К сожалению, такое же поведение по-прежнему происходит. Собственно, все, что я добавляю после «self.subTableWidthConstraint.constant = width», не имеет никакого эффекта для моей проблемы. Эта строка сама по себе применяет это изменение сразу для ярлыков ячеек. Кстати, мы используем ТОЧНЫЕ одинаковые имена переменных! XD – Mamouneyya

Смежные вопросы