0

我正在使用这个答案将文本放在我的UIImage(方法 2)上。问题是,文本出来非常模糊,也不是水平和垂直居中的。这是该行为的屏幕截图:

屏幕

我该如何解决这个问题?

我添加文本的代码是这样的:

- (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;
}
4

1 回答 1

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/floorfand ceil/ceilff如果您正在使用,请使用变体CGFloats

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

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

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

于 2013-08-22T22:20:42.237 回答