Ios 如何提高UINavigationController的性能';s快照

Ios 如何提高UINavigationController的性能';s快照,ios,objective-c,performance,uikit,snapshot,Ios,Objective C,Performance,Uikit,Snapshot,我使用这段代码对UINavigationController的视图进行快照: @implementation UIView (Snapshot) - (UIImage*)snapshot { NSTimeInterval t0 = [[NSProcessInfo processInfo] systemUptime]; UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, [[UIScreen ma

我使用这段代码对UINavigationController的视图进行快照:

@implementation UIView (Snapshot)
- (UIImage*)snapshot
{
    NSTimeInterval t0 = [[NSProcessInfo processInfo] systemUptime];
    UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, [[UIScreen mainScreen] scale]);
    if([self isKindOfClass:[UIScrollView class]]){
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextTranslateCTM(ctx, 0, -((UIScrollView*)self).contentOffset.y);
    }
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    NSTimeInterval t1 = [[NSProcessInfo processInfo] systemUptime];
    NSLog(@"time cost: %lf", t1 - t0);
    return snapshotImage;
}
@end
一,

二,

有什么方法可以提高性能

我找到了原因: 这是因为JASideController将UIBezierPath添加到中的view.layer
(void)styleContainer:(UIView*)容器动画:(BOOL)动画持续时间:(NSTimeInterval)持续时间

当我尝试此操作时,self.view和self.navigationController.view的持续时间约为0.002秒,因此我没有看到这种差异。@rdelmar,很抱歉,我忘了给出设备类型。我在iPodtouch4上测试了它。在iPhone4S上,人们也能感觉到操作速度很慢。在iPhone 5上,速度非常快。在iPhone 4上,self.view和self.navigationController.view分别为0.028和0.034。我会很惊讶,在4S上速度会慢一些。我不知道为什么你的会慢得多。我的导航控制器的rootViewController是JASidePanelController()的一个实例,它包含三个ChildViewController。每个子视图控制器都包含一个带有图像和文本项列表的表视图。在此处调用[naviationController.view snapshot]非常缓慢。进入下一级(显示一条新闻的详细视图控制器)后,[naviationController.view snapshot]变得非常快,在iPod Touch 4上小于0.1。@rdelmar,感谢您的评论。这个问题很奇怪。刚开始一个新项目,创建了一个UINavigationController,其中JASidePanelController作为rootViewController,设置了三个非常简单的childviewcontroller。在iPodtouch4上花费0.1秒。它似乎与UINavigationController和JASidePanelController没有直接关系。我决定再次检查我的代码。
JASidePanelController *sidePanelController = //...
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:sidePanelController];
[navController.view snapshot]; // **cost 1 seconds**
JASidePanelController *sidePanelController = //...
UINavigationController *navController = //...;
sidePanelController.centerPanel = navController;
[navController.view snapshot]; // **cost 0.1 seconds**