动画 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 的自动布局顶部约束导致崩溃,有啥线索吗?