动画 UITableView 宽度约束

Posted

技术标签:

【中文标题】动画 UITableView 宽度约束【英文标题】:Animation UITableView Width Constraint 【发布时间】:2014-12-10 17:16:44 【问题描述】:

在侧边栏菜单视图控制器(基于 SWRevealViewController)中,我使用两个表来模拟两列。因此,当用户单击具有子选项的选项时,另一个表视图控制器会加载它们。 (见图)

现在的问题是,并非第一个表中的所有选项实际上都有子选项。因此,我需要为第一个表(带有主选项的表)设置动画,以便在另一个表上没有要显示的子选项 时,它需要完整的超级视图宽度。只有单击具有子选项的选项才能为宽度设置动画,以便两列并排显示。 (见图片)

(左:预期行为,右:当前行为)

显示子选项和重新加载表格的逻辑已完成,并且运行良好。我唯一的问题是动画。为了设置表格宽度的动画,我想为单元格内的标签设置自动布局,如下所示: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]

所以...任何线索我做错了什么? 谢谢大家!

【问题讨论】:

【参考方案1】:

我对动画也有同样的问题 - 动画块中所有与动画相关的视图的 layoutIfNeeded 对我有帮助。

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

【讨论】:

不幸的是,完全相同的行为仍然发生。实际上,无论我在 'self.subTableWidthConstraint.constant = width' 之后添加什么,都对我的问题没有任何影响。该行仅将更改立即应用于单元格标签。顺便说一句,我们使用的是完全相同的变量名! XD【参考方案2】:

刚刚想通了!由于我使用的是 RTL 语言,因此我需要将标签的模式设置为 Right 而不是默认的 Left 值。

【讨论】:

以上是关于动画 UITableView 宽度约束的主要内容,如果未能解决你的问题,请参考以下文章

UITableView, setContentOffset 动画:NO 不会在 iPad 上滚动

动画 UITableView 的自动布局顶部约束导致崩溃,有啥线索吗?

在约束上动画更改 UITableView 节标题的高度

UITableView setEditing 不会为标签约束更改设置动画

宽度约束动画时UITextfield文本位置没有动画

试图为 UITextfield 宽度约束设置动画,但它不起作用