首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS - DrawRect性能问题

iOS - DrawRect性能问题
EN

Stack Overflow用户
提问于 2012-06-16 05:33:14
回答 3查看 2.2K关注 0票数 0

我是第一次使用-drawRect,试图以另一种方式提高UITableView的速度。然而,drawRect方法似乎在很大程度上降低了表的速度。

您能告诉我如何改进下面的drawRect方法以提高表的速度吗?

编辑

在drawRect方法中,我将两个NSStrings写入单元格的视图,将两个UIImages和一个投影写入NSStrings和一个UIImages。

异步下载上述图像之一,然后调用setNeedsDisplay将该UIImage绘制到屏幕上。我认为这可能是延迟发生的最初原因。

代码语言:javascript
复制
- (void) drawRect:(CGRect) rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    [[UIColor clearColor] set];

    CGContextFillRect(context, rect);

    CGContextSaveGState(context);
    CGContextSetShadow(context, CGSizeMake(1,1),1);
    //draw text here

    if (shouldDrawImage == YES) {

        CGContextDrawImage(context, CGRectMake(10, 10, 40, 40), self.image.CGImage);

    }

    CGContextDrawImage(context, CGRectMake(self.frame.size.width - 16, 0, 16, self.frame.size.height), [UIImage imageNamed:@"right_bar_including_holes"].CGImage);

    NSString *authorName = [[self.info objectForKey:@"user"] objectForKey:@"full_name"];

    [RGB(219, 240, 73) set];

    CGSize maximumLabelSize = CGSizeMake(self.frame.size.width - 10 - 55 - 16,9999);
    CGSize authorsize = [authorName sizeWithFont:[UIFont boldSystemFontOfSize:15]
                                     constrainedToSize:maximumLabelSize 
                                         lineBreakMode:UILineBreakModeWordWrap]; 
    [authorName drawInRect:CGRectMake(60, 10, self.frame.size.width - 60, authorsize.height) withFont:[UIFont boldSystemFontOfSize:15]];

    [RGB(249,249,249) set];

    NSString *description = [self.info objectForKey:@"description"];
    CGSize descriptionSize = [description sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap];

    [description drawInRect:CGRectMake(60, authorsize.height + 15, descriptionSize.width, descriptionSize.height) withFont:[UIFont systemFontOfSize:14]];

    CGContextRestoreGState(context);

}

- (NSString *) reuseIdentifier {
    return NSStringFromClass([SlideCell class]);
}

- (void) updateCellInfo:(NSDictionary *)_info {
    [self setInfo:_info];

    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
    [iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[self.info objectForKey:@"user"] objectForKey:@"avatar"]]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *_image) {
        dispatch_async(dispatch_get_main_queue(), ^{
            shouldDrawImage = YES;
            self.image = [self roundedImage:_image];
            [iv release];
            [self setNeedsDisplay];
        });

    } failure:nil];

    [self setNeedsDisplay];

    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-16 05:41:55

是的-你在你的应用上运行Instruments的时间配置文件,告诉你到底花了多少时间,以及在哪里。它会告诉你它是图像、字符串、阴影还是其他东西。

票数 2
EN

Stack Overflow用户

发布于 2012-06-16 14:15:52

:你应该先分析代码,看看图像是不是问题所在。

我不确定异步下载图像时(您正在使用的) AFNetworking库是如何工作的。

如果您知道该图像是问题所在,我怀疑该图像在设置时需要在UIImageView中重新缩放。这可能就是问题所在。您需要将要设置为UIImageView的UIImage重新缩放为UIIImageView的框架,这样就不会触发自动重新缩放。这在滚动时是很昂贵的。

您接收到图像,并立即将代码分派到主线程。潜在的重新缩放可以在“引擎盖下”工作。我会将该方法更改为:

代码语言:javascript
复制
UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, IMGSIZEX, IMGSIZEY)];
    [iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[self.info objectForKey:@"user"] objectForKey:@"avatar"]]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *_image) {
        //Note you have to implement rescaleToFitSize
        UIImage* rescaled = [_image rescaleToFitSize:iv.frame.size];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.image = _image;
            [iv release];
            [self setNeedsDisplay];
        });

    } failure:^{
         //Handle failure! You create mem. leak on failure
         [iv release];
}];

顺便说一句,您不能处理图像下载过程中的失败。你绝对应该这么做。

票数 1
EN

Stack Overflow用户

发布于 2012-06-16 15:26:02

只要你使用得当,库存UITableView的效率是一样的: 1.回收单元格(出队) 2.尽可能避免透明(alpha混合会减慢速度) 3.配置重复使用的单元格不会占用太多的处理时间。

我不认为任何人可以通过重写drawRect来显著改进苹果的代码……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11058489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档