为什么具有UISegmentedControl对象的自定义表格视图单元格的滚动性能较差?

Aly*_*hak 14 scroll uitableview

我有一个UITableView,其中包含在xib文件中定义的自定义单元格,当单元格上有UISegmentedControl时,我的设备上的滚动性能(不稳定)很差.NSLog语句显示正在分配和重用它们应用的单元.我的cellForRowAtIndexPath方法的代码如下.根据Apple的文档,在xib中进行连接.(在模拟器btw中顺利滚动)

- (UITableViewCell *)tableView:(UITableView *)tableView
              cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell =  
           [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" 
                               owner:self  
                               options:nil];  
        cell = self.tvCell;
        self.tvCell = nil;
    }

    cell.layer.shouldRasterize = YES;     // build error is here

    UILabel *lbl = (UILabel *)[cell viewWithTag:1];

    [lbl setText:[NSString stringWithFormat:@"Q%i", indexPath.row+1]];  

    return cell;
}
Run Code Online (Sandbox Code Playgroud)

Noa*_*oon 47

表格单元格在滚动时必须执行的任何绘图都会导致性能问题; 当你有很多子视图时,往往会有大量的绘图正在进行,而且 - 正如你所观察到的那样 - 让你的滚动变得非常不稳定.有几种方法可以尝试减少这种情况.

第一步是确保您的单元格本身以及尽可能多的子视图将其opaque属性设置为YES.不透明的视图不必与它们下面的内容混合,这样可以节省大量时间.

您可能还想将单元格的图层设置为栅格化,如下所示:

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
Run Code Online (Sandbox Code Playgroud)

这会将您的视图层次结构折叠成一个平面位图,这是Core Animation喜欢绘制的那种东西.请注意,任何动画视图 - 活动指示器,例如 - 将强制该位图每次更改时更新,即很多.在这种情况下,您不希望单元格光栅化所有内容; 您可能只使用具有任何此类动态内容的另一个子视图下的所有相对静态视图(例如标签)的子视图,并且只有第一个光栅化.

  • 如果您的.m中没有#import <QuartzCore/QuartzCore.h>,则可能会出现该错误; 另外,shouldRasterize仅适用于iOS 3.2及更高版本. (3认同)