表视图中的SetNeedsDisplay

时间:2013-02-19 22:27:27

标签: objective-c uiview uitableview setneedsdisplay

我的问题是并非所有单元格都正确初始化,并且正确的UIView是渲染图像。(参见下面的代码)在iphone 4上,它总是与带有视网膜显示屏的iphone上的同一个单元格也是另一个单元格。在此设置中,setNeedsDisplay将无法运行。 如果我在IBoutlet中使用相同的结构,它的工作原理。 ! 我需要在一些单元格中使用图像文件.png和其他一些单元格定义的绘图方法,它使用drawrect或更好我应该使用setNeedsDisplay方法.....

出了什么问题!!!

我的代码

tableview ... cell

static NSString *CellIdentifier = @"TypeCell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    CellTypes *cellType = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = cellType.title;
    cell.detailTextLabel.text = cellType.detail;

    if ( [cellType.type rangeOfString:@"TL"].location != NSNotFound) {
        cell.imageView.image = [UIImage imageNamed:[cellType.type stringByAppendingString:@"Thumb"]];
        cell.indentationWidth = 10;

    }
    else {

        static CGFloat scale = 0.0;  // old API , screen  values
        UIScreen *screen = [UIScreen mainScreen];
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
            scale = [screen scale];
        }
        if (scale>0.0) {
            UIGraphicsBeginImageContextWithOptions(cell.imageView.bounds.size, NO, scale);
        }
        else {
            UIGraphicsBeginImageContext(cell.imageView.bounds.size);
        }

        CGRect imageRect = CGRectMake(0, 0, 84, 84 );  //    cell.imageView.bounds;

        FittingImageView *fittingImage = [[FittingImageView alloc] initWithFrame:imageRect];
        fittingImage.thumb = YES;
        fittingImage.title = offSetType.title;

        [fittingImage drawRect:imageRect]; // this works but skips one imageRect
//        [fittingImage setNeedsDisplay]; //this won't work.
        [cell.layer renderInContext:UIGraphicsGetCurrentContext()];

        cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

    }
    return cell;

1 个答案:

答案 0 :(得分:0)

你永远不能自己打电话给drawRect:。它由Cocoa调用,只有Cocoa可以设置上下文。目前还不清楚你在这里要做什么。我不知道FittingImageView是什么。你正在创造它,然后在任何情况下抛弃它。

然后尝试将单元格本身渲染为图像,并将该图像放入单元格的imageview中。这没有意义。

您可能会误解如何创建,重用和绘制tableview单元格。您应该重新阅读"Creating and Configuring a Table View."

要记住的主要事项:

  • 在此例程中,您的工作是创建新单元格,或重新配置可重复使用的单元格(如果dequeueReusableCellWithIdentifier:返回某些内容)。
  • 此例程不适用于绘制单元格。这将在很晚以后发生,并且细胞的工作就是吸引自己。您只是配置单元格。将所有内容放入其中,以便稍后绘制。
  • 您通常不希望在此例程中计算昂贵的东西。计算其他地方并缓存它们。此例程应配置单元格,将数据打入其中并返回。如果您尝试在此例程中创建新图像,则表格视图将会断断续续。
  • 你不应该在这个例程的中间弄乱单元格的层。如果您需要复杂的内容,则应创建具有自己的drawRect:
  • 的自定义单元格