将文本放在UIImage和文本上是模糊的吗?

时间:2013-08-22 21:10:51

标签: objective-c uiimage

我使用this回答将文字放在我的UIImage上(方法2)。问题是,文本非常模糊,并且不是水平和垂直居中。以下是该行为的屏幕截图:

screen

我该如何解决这个问题?

我添加文字的代码是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
    }

    NSString *metaScore =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"metaScore"]);
    NSString *title = _getString([[news objectAtIndex:indexPath.row] objectForKey:@"title"]);
    NSString *releaseDate =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"releaseDate"]);
    NSString *type =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"type"]);
    NSString *rating =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"rating"]);

    [cell.textLabel setLineBreakMode:NSLineBreakByWordWrapping];
    cell.textLabel.text = title;
    cell.detailTextLabel.numberOfLines = 4;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@\n%@\n%@", releaseDate, type, rating];

    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.frame = CGRectMake(0, 0, 50, 50);

    imageView.image = [self addText:[UIImage imageNamed:@"green.png"] text:metaScore];
    cell.image = imageView.image;

    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];

    return cell;
}

-(UIImage *)addText:(UIImage *)img text:(NSString *)text1{
    int w = img.size.width;
    int h = img.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);

    char* text= (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding];
    CGContextSelectFont(context, "Arial", 20, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode(context, kCGTextFill);
    CGContextSetRGBFillColor(context, 256, 256, 256, 1);
    CGContextShowTextAtPoint(context, 20, 20, text, strlen(text));
    CGImageRef imgCombined = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    UIImage *retImage = [UIImage imageWithCGImage:imgCombined];
    CGImageRelease(imgCombined);

    return retImage;
}

1 个答案:

答案 0 :(得分:3)

您可能无法在像素对齐的边界上绘制文字。

例如,如果您将文字定位在x:12.4, y:18.7,则文字不会呈现清晰,因为它们不会与屏幕上的像素对齐。对于标准显示器,您需要位置和大小为整数(它们不能是分数)。对于视网膜显示器,您可以通过获得半分来逃避,但通常也更容易将它们保持为整数。

如果您使用CGRect确定文字的位置,可以使用CGRectIntegral()为您对齐它们。这将使位置变得平坦,并且尺寸上限。例如:

CGRect position = CGRectMake(12.2, 17.8, 44.7, 49.2);
position = CGRectIntegral(position);
/* Position is now
   x: 12, y: 17
   w: 45, h: 50
*/

如果您在没有CGRect的情况下进行此操作,则可以使用floor/floorfceil/ceilf(如果您正在使用f,请使用CGFloats变体)

编辑:请记住,CoreGraphics适用于像素而不是点,因此您需要在任何计算中考虑比例因子。值得庆幸的是,CoreGraphics比你想象的要容易一些。只需在之后直接插入,即可创建您的上下文。这将为该上下文中的任何未来计算设置正确的比例。

CGFloat scale = [[UIScreen mainScreen] scale];
CGContextScaleCTM(context, scale, scale);

至于文本的对齐方式,这并不容易。您可以手动将其设置为(20,20),这将设置第一个字符左上角的位置。这不太可能使您的文本居中。虽然您不知道文本的渲染宽度和高度,但您无法补偿左上角的位置以使文本居中。你会在这里挣扎,但是一旦你能找到文本的渲染宽度和高度,就可以使用它和图像的宽度/高度来计算正确的位置。