我使用this回答将文字放在我的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;
}
答案 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/floorf
和ceil/ceilf
(如果您正在使用f
,请使用CGFloats
变体)
编辑:请记住,CoreGraphics适用于像素而不是点,因此您需要在任何计算中考虑比例因子。值得庆幸的是,CoreGraphics比你想象的要容易一些。只需在之后直接插入,即可创建您的上下文。这将为该上下文中的任何未来计算设置正确的比例。
CGFloat scale = [[UIScreen mainScreen] scale];
CGContextScaleCTM(context, scale, scale);
至于文本的对齐方式,这并不容易。您可以手动将其设置为(20,20),这将设置第一个字符左上角的位置。这不太可能使您的文本居中。虽然您不知道文本的渲染宽度和高度,但您无法补偿左上角的位置以使文本居中。你会在这里挣扎,但是一旦你能找到文本的渲染宽度和高度,就可以使用它和图像的宽度/高度来计算正确的位置。