我在Swift上开发iOS通用应用程序,使用自动布局并仅支持肖像.
我发现UIViewController#viewdidlayoutsubviews多次被叫.相反,viewDidLoad只能在启动MyApp时调用一次UIViewController.
为什么要viewdidlayoutsubviews多次打电话?每个UIView(UIButtons,UITextFields等等)的约束将按顺序执行?
任何信息将不胜感激.
我正在开发一个使用CoreGraphics进行渲染的绘画应用程序.我的问题是,对于性能,我试图将更新限制为仅更改的视图的某些部分.为此,我使用setNeedsDisplayInRect:,但有时视图会更新其整个内容,从而导致口吃.这在第3代iPad上尤其明显,但在模拟器和iPad2中也会出现较小程度的问题.我试图删除此行为.
为了展示这个问题,我使用Xcode中的模板创建了一个简单的"单视图"项目.创建了一个自定义UIView子类,我将其设置为xib文件中的视图控制器视图.
将此添加到UIViewController:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// Asks that the view refreshes a smal rectangle
[self.view setNeedsDisplayInRect:CGRectMake(10, 10, 20, 20)];
}
Run Code Online (Sandbox Code Playgroud)
将其添加到MyView(我的自定义视图):
- (void)drawRect:(CGRect)rect
{
// Just log what is being updated
NSLog(@"%@", NSStringFromCGRect(rect));
}
Run Code Online (Sandbox Code Playgroud)
就是这样.如果我在第3台iPad(实际设备)上运行该应用程序,日志会显示该视图在其内容中不时重新绘制(非常频繁).这太令人沮丧了,我没有想法
更新:这是一些日志.它肯定会显示有时更新的完整视图.我试图让它完全停止,但无法想象如何...
2012-05-04 08:34:01.851 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.184 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.197 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.215 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.226 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.242 TestUpdateArea[45745:707] {{10, 10}, …Run Code Online (Sandbox Code Playgroud)