答案 0 :(得分:0)
我很想知道是否有更好的答案。
此时,我所知道的就是在日历视图中覆盖setFrame
,当它发生变化时,将setNeedsLayout
发送到其超级视图。
但我不确定标准视图是否会正确自动调整此值。通常,几何体沿视图树向下流动,而不是向上流动,并且您希望它同时执行这两种操作。
您可能必须在包含视图上实现layoutSubviews。
答案 1 :(得分:0)
将动画逻辑移出特定视图并进入管理所有控件的视图控制器。视图仍然可以找出自己合适的大小,并让视图控制器询问。例如:
[self.calendarView setDate:date];
CGSize calendarSize = [self.calendarView sizeForDate:date];
[UIView animateWithDuration:...
animations:^{
... re-layout everything, including the calendarView ...
}];
另一种类似的方法:
[self.calendarView setDate:date];
[UIView animateWithDuration:...
animations:^{
[self.calendarView sizeToFit];
... re-layout everything else ...
}];
根据您的偏好,有很多类似的方法。但关键是将逻辑移出特定视图。通常,视图控制器是最佳解决方案。如果控件创建的逻辑集合可以归入单个UIView
,那么您可以让“集合”UIView
在其layoutSubviews
中管理相同的内容,但更常见的是视图控制器是一个更好的解决方案。
答案 2 :(得分:0)
感谢您的帮助。我成功地尝试了这两种方法。 setFrame的覆盖和layoutSubviews的实现有效,但其他控件跳转到新位置,而不是随着日历控件的增长动画到这些位置。
在动画期间移动其他控件的方法是我必须使用的方法。但是,我想保持控件的逻辑非常自包含以便重用,所以我将动画保留在控件中,但添加了一个委托以响应大小更改,并将委托调用放在动画块中。在完全公开的时候,我还在制作控件的同时将新月的日历设置为控件的动画,这样我就可以在动画块中完成这两件事了。
所以,结束代码看起来像这样:
// inside the calendar control:
[UIView animateWithDuration:0.5 animations:^{
self.frame = newOverallFrame; // animate the growth of the control
_offScreenCalendar.frame = newOnScreenFrame; // animate new month on screen
_onScreenCalendar.frame = newOffScreenFrame; // animate old month off screen
if (self.delegate)
{
[self.delegate handleCalendarControlSizeChange:newOverallFrame]; // animate other controls per the delegate
}
}];