- 我构建了一个 UIControl 子类来在 iPhone 上显示 1 个月的日历视图。大多数月份需要 5 周来显示日期,但有些月份需要 6 周,因此我构建了控件以根据需要动态调整自身大小。我在这里使用 UIView 动画来更改控件的框架。
- 问题是,我现在需要屏幕上的其他控件在日历更改大小时移动/调整大小。我真的需要在日历控件改变大小的动画时发生这种情况。理想情况下,我不会在我的日历控件中编写有关屏幕上其他控件的大量细节来执行此操作。
- 这里最好的策略是什么?我希望我能以某种方式将其他控件锚定到日历控件的框架上,并让平台在为框架更改设置动画时调整它们的位置/大小。但是,到目前为止,我找不到任何支柱和弹簧的组合来实现这一点。
- 我是否只需要硬着头皮将其他屏幕控件添加到日历控件内发生的动画中?
3 回答
谢谢您的帮助。我成功地尝试了这两种方法。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
}
}];
我很想看看是否有更好的答案。
在这一点上,我所知道的就是覆盖setFrame
你的日历视图,当它发生变化时,发送setNeedsLayout
到它的超级视图。
但我不确定标准视图是否会正确自动调整大小。通常,几何图形顺着视图树向下流动,而不是向上流动,您希望它两者兼而有之。
您可能必须在包含视图上实现 layoutSubviews。
将动画逻辑移出特定视图并移入管理所有控件的视图控制器中。视图仍然可以计算出自己合适的大小,并让视图控制器询问。例如:
[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
,但更常见的是视图控制器在这里是一个更好的解决方案。