优化UITableView滚动性能

原创 2014年05月10日 11:28:48

自定义的cell如下:


第一个:Instruments测试,iphone4 38fps-45fps,iphone3G 25fps

// table with normal XIB based cells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) {

NSArray *nib = [[UINib nibWithNibName:@"CustomCell" bundle:nil] instantiateWithOwner:self options:nil];
cell = (CustomCell*)[nib objectAtIndex:0];
}

// other initialization goes here
    cell.titleLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
    cell.subTitleLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
    cell.timeTitleLabel.text = @"yesterday";
    cell.thumbnailImage.image = [UIImage imageNamed:@"iOS6"];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

return cell;
}


第二个,优化之后的代码为,Instruments测试 iphone 4/iphone 4s接近60帧每秒

// table with with built in cells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];

    cell.imageView.image = [UIImage imageNamed:@"ios5"];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}

第三,使用Loren Bricher提供的技术,几乎每台设备都达到了60fps,包括iphone3G

Loren BricherTwitter中写了关于Tweetie中流畅滚动的内容。以下代码就是使用Loren提供的技术来为UITableView创建自定义表单元。

// table with with custom drawn cells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomDrawnCell";

CustomDrawnCell *cell = (CustomDrawnCell*)[tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) 
{
cell = [[CustomDrawnCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

    [cell setTitle:[NSString stringWithFormat:@"Row %d", indexPath.row] 
          subTitle:[NSString stringWithFormat:@"Row %d", indexPath.row] 
              time:@"yesterday"
         thumbnail:[UIImage imageNamed:@"ios5"]];

// other initialization goes here
return cell;
}


ABTableViewCell

#import <UIKit/UIKit.h>

// to use: subclass ABTableViewCell and implement -drawContentView:

@interface ABTableViewCell : UITableViewCell
{
UIView *contentView;
}

- (void)drawContentView:(CGRect)r; // subclasses should implement

@end
#import "ABTableViewCell.h"

@interface ABTableViewCellView : UIView
@end

@implementation ABTableViewCellView

- (void)drawRect:(CGRect)r
{
[(ABTableViewCell *)[self superview] drawContentView:r];
}

@end

@implementation ABTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
contentView = [[ABTableViewCellView alloc]initWithFrame:CGRectZero];
contentView.opaque = YES;
[self addSubview:contentView];
}
return self;
}

- (void)setFrame:(CGRect)f
{
[super setFrame:f];
CGRect b = [self bounds];
b.size.height -= 1; // leave room for the seperator line
[contentView setFrame:b];
}

- (void)setNeedsDisplay
{
[super setNeedsDisplay];
[contentView setNeedsDisplay];
}

- (void)drawContentView:(CGRect)r
{
// subclasses should implement this
}

@end


CustomDrawCell

#import <UIKit/UIKit.h>
#import "ABTableViewCell.h"

@interface CustomDrawnCell : ABTableViewCell  {

    NSString *_title;
    NSString *_subTitle;
    NSString *_timeTitle;
    UIImage *_thumbnail;
}

- (void)setTitle:(NSString*) title subTitle:(NSString*) subTitle time:(NSString*) time thumbnail:(UIImage *)aThumbnail;

@end
#import "CustomDrawnCell.h"

@implementation CustomDrawnCell

static UIFont *titleFont = nil;
static UIFont *subTitleFont = nil;
static UIFont *timeTitleFont = nil;

- (void)setTitle:(NSString*) aTitle subTitle:(NSString*) aSubTitle time:(NSString*) aTimeTitle thumbnail:(UIImage *)aThumbnail
{
    if (_title != aTitle) {
        _title = aTitle;        
    }

    if (_subTitle != aSubTitle) {
        _subTitle = aSubTitle;
    }

    if (_timeTitle != aTimeTitle) {
        _timeTitle = aTimeTitle;
    }

    if (_thumbnail != aThumbnail) {
        _thumbnail = aThumbnail;        
    }

    [self setNeedsDisplay];
}

+(void) initialize
{
    titleFont = [UIFont systemFontOfSize:17];
    subTitleFont = [UIFont systemFontOfSize:13];
    timeTitleFont = [UIFont systemFontOfSize:10];
}

+(void) dealloc
{
    [super dealloc];
}

-(void) drawContentView:(CGRect)r
{    
    static UIColor *titleColor;    
    titleColor = [UIColor darkTextColor];
    static UIColor *subTitleColor;    
    subTitleColor = [UIColor darkGrayColor];
    static UIColor *timeTitleColor;    
    timeTitleColor = [UIColor colorWithRed:0 green:0 blue:255 alpha:0.7];

    CGContextRef context = UIGraphicsGetCurrentContext();

    if(self.highlighted || self.selected)
{
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
CGContextFillRect(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
CGContextSetFillColorWithColor(context, titleColor.CGColor);
}
else
{
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextFillRect(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
CGContextSetFillColorWithColor(context, titleColor.CGColor);
}

    [titleColor set];
    [_thumbnail drawInRect:CGRectMake(12, 4, 35, 35)];
    [_title drawAtPoint:CGPointMake(54, 3) 
                    forWidth:200 
                    withFont:titleFont 
                    fontSize:17 
               lineBreakMode:UILineBreakModeTailTruncation 
          baselineAdjustment:UIBaselineAdjustmentAlignCenters];    

    [subTitleColor set];
    [_subTitle drawAtPoint:CGPointMake(54, 23) 
               forWidth:200 
               withFont:subTitleFont 
               fontSize:13 
          lineBreakMode:UILineBreakModeTailTruncation 
     baselineAdjustment:UIBaselineAdjustmentAlignCenters];    

    [timeTitleColor set];
    [_timeTitle drawAtPoint:CGPointMake(262, 3) 
                  forWidth:62 
                  withFont:timeTitleFont 
                  fontSize:10 
             lineBreakMode:UILineBreakModeTailTruncation 
        baselineAdjustment:UIBaselineAdjustmentAlignCenters];    

}
@end

具体源码在这里

优化UITableView滚动性能

自定义的cell 第一个:Instruments测试,iphone4 38fps-45fps,iphone3G 25fps // table with normal XIB based cells...
  • chaoyuan899
  • chaoyuan899
  • 2014-05-10 11:28:48
  • 4109

uitableview 滚动到底部

1. UITableView滚动到最后一行: [self.tableView setContentOffset:CGPointMake(0, self.tableView.contentSize.he...
  • k12104
  • k12104
  • 2014-05-12 15:46:05
  • 22791

UITableView的性能优化,提升列表滚动的流畅性

本篇博客目的是:总结UITableView性能优化方向,有些优化方式是我在开发中使用到过的,有些是没有用到过的,当中也有参考、查看很多大神的总结,这才有了本篇博客,仅供大家参考!...
  • qq_27484549
  • qq_27484549
  • 2015-09-20 01:55:02
  • 3245

老生常谈之UITableView的性能优化

新的一年开始了,新的工作也开始了,刚过完年回来,感觉节后综合征还是很严重的~今早差点迟到。。。废话不多说,今天就来说说iOS最常用的控件-UITableView,基本用法就不多说了,大家应该都知道,当...
  • hmh007
  • hmh007
  • 2017-02-07 11:11:29
  • 6978

iOS 判断UITableView是否滚动在最底部

iOS 根据判断UITableView或者UIScrollView是否滚动在最底部,然后对接收到的信息进行处理,判断新消息来的时候是否滚动,提升用户体验。...
  • glt_code
  • glt_code
  • 2016-12-01 16:30:51
  • 4968

iOS UITableView(十二) 设置tableView的滚动范围

在某些情况下中我们需要设置tableView的滚动范围   这里我们设置 tableView的contentSize 属性即可  当tableview 滑动时设置它们的conte...
  • shan1991fei
  • shan1991fei
  • 2016-01-12 23:34:22
  • 634

UITableView性能优化,超实用

1. Cell重用    1.1>数据源方法优化 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtInd...
  • u011452278
  • u011452278
  • 2017-03-09 15:29:01
  • 4798

iOS:关于UITableView的性能优化点

2015年最后一天,来总结一下iOS开发中遇到过的性能大坑,特别是UITableView这一用途非常广泛的控件。 一个UITableView为展示主题的app遇到的问题大概分为这几类:1、滚动卡顿。2...
  • trmbhs
  • trmbhs
  • 2015-12-31 16:44:30
  • 658

iOS UITableView 快速滚动(索引方式实现)

思路:UITableView一次性加载数据过多时,需要滑动多次触底。想通过索引实现快速滑动,索引中加载20个空点。用户在最右端滑动时,索引框显示,当触及索引点时指向其想对应的UITableView的R...
  • m372897500
  • m372897500
  • 2016-05-29 23:02:13
  • 848

让UITableView自动滑动(定位)到某一行cell

转载自:http://blog.csdn.net/lovenjoe/article/details/8588898 NSIndexPath *scrollIndexPath = ...
  • chenyong05314
  • chenyong05314
  • 2013-05-15 14:05:03
  • 13417
收藏助手
不良信息举报
您举报文章:优化UITableView滚动性能
举报原因:
原因补充:

(最多只允许输入30个字)