当数据发生变化时,如何对UIControl进行大小调整

时间:2012-01-27 18:17:16

标签: ios uicontrol

  • 我已经构建了一个UIControl子类来显示一个月的日历视图 一部iPhone。大多数月份需要5周才能显示日期,但是 几个月需要6个,所以我已经构建了动态调整大小的控件 根据需要自己。我正在使用UIView动画来改变框架 控制在这里。
  • 问题是,我现在需要屏幕上的其他控件来 日历更改大小时移动/调整大小。我真的需要那个 随着日历控件的动画改变大小而发生。 理想情况下,我不会在日历中编写大量详细信息 控制屏幕上的其他控件。
  • 这里最好的策略是什么?我希望我能以某种方式锚定 其他控件到日历控件的框架,并具有 平台调整其位置/大小,因为它动画帧更改。 但是,到目前为止,我找不到任何支柱和弹簧的组合 实现这一目标。
  • 我只需要咬紧牙关并添加我的其他屏幕控制 我的日历控件中发生的动画?

3 个答案:

答案 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
    }
}];