Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在子视图之后刷新父UIScrollView contentSize';s drawRect_Iphone_Objective C_Cocoa Touch_Ipad_Uiview - Fatal编程技术网

Iphone 在子视图之后刷新父UIScrollView contentSize';s drawRect

Iphone 在子视图之后刷新父UIScrollView contentSize';s drawRect,iphone,objective-c,cocoa-touch,ipad,uiview,Iphone,Objective C,Cocoa Touch,Ipad,Uiview,我有一个UIScrollView,里面有一个UIView 我不知道子视图的大小,直到它需要显示的所有内容都显示出来,这在以后的图形中可能会更改。(它具有逐位添加的表格、文本等)。因此,我需要在子视图的drawRect完成时更新滚动视图的内容大小 有没有一种好方法可以在drawRect之后触发所需的[myScrollView setContentSize]&[mySubView setNeedsDisplay](这将调用drawRect,因此我将采取步骤避免无限循环)或任何其他实际适用于这种情况的

我有一个UIScrollView,里面有一个UIView

我不知道子视图的大小,直到它需要显示的所有内容都显示出来,这在以后的图形中可能会更改。(它具有逐位添加的表格、文本等)。因此,我需要在子视图的drawRect完成时更新滚动视图的内容大小

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


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

< P>可以使用NSn通报。
        [[NSNotificationCenter defaultCenter] 
                      postNotificationName:@"drawingLoopDone_Notification"
                                    object:nil];
在图形代码的末尾,发布通知

        [[NSNotificationCenter defaultCenter] 
                      postNotificationName:@"drawingLoopDone_Notification"
                                    object:nil];
添加适当的视图控制器作为通知的观察者

  [[NSNotificationCenter defaultCenter] 
          addObserver:self 
             selector:@selector(setNeedsDisplay)
                 name:@"drawingLoopDone_Notification" 
               object:nil];
收到通知后(或在viewDidUnload中),按如下方式清理通知侦听器:

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

[theView performSelector:@selector(someSelector) withObject:nil afterDelay:0.0];
…这至少使hack能够工作,因为它在drawRect完成之前不会调用选择器,因此显然需要的setNeedsDisplay(导致另一个drawRect,并带有一个避免循环的检查)不会被取消


我仍然很想知道是否有更标准的方法来更新滚动视图的内容大小,如果在绘制之前您不知道滚动视图的子视图的大小。

+1尝试一下,但它不起作用。这个方法是直接调用的,所以就像我直接调用它一样。drawRect发送通知,调用选择器,然后执行返回到drawRect,所以当它结束时,系统会清除setNeedsDisplay标志。这很令人失望。是时候拔出大炮了。我认为您需要创建2个NSInvocationOperation实例—drawRect和setContentSize,setContentSize依赖于drawRect—并将它们放在NSOperationQueue上。我不知道你的情况是否值得关注。我只做过相对简单的op队列实现,所以我可以诚实地告诉你这些文档并祝你好运。这不会有同样的问题吗?这看起来也像是严重的过度工程。介意详细分享你的最终解决方案吗?