在子视图的drawRect之后刷新父UIScrollView contentSize

时间:2011-04-19 19:12:28

标签: iphone objective-c cocoa-touch ipad uiview

我有一个UIScrollView,里面有UIView。

我不知道子视图的大小,直到需要显示的所有内容都已经存在,并且这可能会在以后的图纸上发生变化。 (它有逐位添加的表格,文本等)。所以,我需要在子视图的drawRect完成时更新滚动视图的内容大小。

是否有一种好方法可以触发所需的[myScrollView setContentSize]& [mySubView setNeedsDisplay](这会调用drawRect,所以我会采取措施避免无限循环)在drawRect或任何其他实际适用于这种情况的解决方案之后?

在对内容大小更改执行操作之前,似乎需要在子视图上调用setNeedsDisplay。我所要做的就是从子视图的drawRect设置setContentSize然后我按下一个触发setNeedsDisplay的按钮,然后contentSize刷新。所以我可以设置一个计时器并等待下一个运行循环来执行setNeedsDisplay?但这是一个可怕的黑客。另外我猜测调整从子视图调用的代码中的内容大小drawRect是一个禁忌,如果UIKit在绘制视图层次结构的过程中依赖于视图层次结构保持不变。

2 个答案:

答案 0 :(得分:2)

您可以使用NSNotification。

在绘图代码的末尾,发布通知。

        [[NSNotificationCenter defaultCenter] 
                      postNotificationName:@"drawingLoopDone_Notification"
                                    object:nil];

将适当的视图控制器添加为通知的NSObserver。

  [[NSNotificationCenter defaultCenter] 
          addObserver:self 
             selector:@selector(setNeedsDisplay)
                 name:@"drawingLoopDone_Notification" 
               object:nil];

收到通知后(或在viewDidUnload中),清理通知监听器,如下所示:

    [[NSNotificationCenter defaultCenter] 
                removeObserver:self name:@"drawingLoopDone_Notification" object:nil];

答案 1 :(得分:0)

我刚刚离开...

[theView performSelector:@selector(someSelector) withObject:nil afterDelay:0.0];

...至少使黑客工作,因为它在drawRect完成之后才调用选择器,所以显然需要的setNeedsDisplay(导致另一个drawRect,带有检查以避免循环)不是取消。

我还是很想听听是否有一种更标准的方法来更新滚动视图的内容大小,直到它被绘制出来之前你不知道它的子视图的大小。