Objective c 将文本放在图像和文本上是模糊的?
我正在使用answer将文本放在我的Objective c 将文本放在图像和文本上是模糊的?,objective-c,uiimage,Objective C,Uiimage,我正在使用answer将文本放在我的UIImage(方法2)上。问题是,文本非常模糊,而且没有水平和垂直居中。以下是该行为的屏幕截图: 我怎样才能解决这个问题 我要在其中添加文本的代码如下: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueRe
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;
}
您可能没有在像素对齐的边界上绘制文本 例如,如果将文本定位在
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
(如果使用cfloats
,则使用f
变量)
编辑:请记住CoreGraphics使用像素而不是点,因此在任何计算中都需要考虑比例因子。谢天谢地,CoreGraphics让这比你想象的要容易一些。只需在创建上下文后直接插入此。这将为该上下文中的任何未来计算设置正确的比例
CGFloat scale = [[UIScreen mainScreen] scale];
CGContextScaleCTM(context, scale, scale);
至于文本对齐,这并不容易。您将手动将其设置为(20,20),这将设置第一个字符左上角的位置。这不太可能使文本居中。由于您不知道文本的渲染宽度和高度,因此无法补偿左上角的位置以使文本居中。您将在这里遇到困难,但一旦您能够找到文本的渲染宽度和高度,您就可以使用该宽度和图像的宽度/高度来计算正确的位置。您可能没有在像素对齐的边界上绘制文本 例如,如果将文本定位在
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
(如果使用cfloats
,则使用f
变量)
编辑:请记住CoreGraphics使用像素而不是点,因此在任何计算中都需要考虑比例因子。谢天谢地,CoreGraphics让这比你想象的要容易一些。只需在创建上下文后直接插入此。这将为该上下文中的任何未来计算设置正确的比例
CGFloat scale = [[UIScreen mainScreen] scale];
CGContextScaleCTM(context, scale, scale);
至于文本对齐,这并不容易。您将手动将其设置为(20,20),这将设置第一个字符左上角的位置。这不太可能使文本居中。由于您不知道文本的渲染宽度和高度,因此无法补偿左上角的位置以使文本居中。您将在这里遇到困难,但一旦您能够找到文本的渲染宽度和高度,您就可以使用此值和图像的宽度/高度来计算正确的位置。您必须对水平/垂直滚动进行计算,图像本身看起来分辨率很低,这看起来与该分辨率下的文本一样好。。。在更大的图像上渲染?因为可能文本的宽度和/或高度是奇数,中心点可能是分数像素,而不是整像素…这个答案有点模棱两可。你能发布一些真实的代码吗?图像必须是50px乘50px。我正在uitableviewcell上渲染它。你必须对水平/垂直滚动进行计算,图像本身看起来分辨率很低,这看起来就像文本在该分辨率下一样好。。。在更大的图像上渲染?因为可能文本的宽度和/或高度是奇数,中心点可能是分数像素,而不是整像素…这个答案有点模棱两可。你能发布一些真实的代码吗?图像必须是50px乘50px。我正在uitableviewcell上渲染它。使用您的代码示例,这是我得到的UIImage:但在视网膜设备上查看时,会出现模糊。要解决这个问题,您需要考虑屏幕的比例因子。我会更新我的答案,所以我把它放在
CGContextRef context=CGBitmapContextCreate(NULL,w,h,8,4*w,colorSpace,kcgimagealphapremultipledfirst)后面代码>?它仍然很模糊。使用你的代码示例,这是我得到的UIImage:但是当在视网膜设备上观看时,你会得到模糊度。要解决这个问题,您需要考虑屏幕的比例因子。我会更新我的答案,所以我把它放在CGContextRef context=CGBitmapContextCreate(NULL,w,h,8,4*w,colorSpace,kcgimagealphapremultipledfirst)后面代码>?还是很模糊。