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と、テキストは画面上のピクセルに合わせられないため、鮮明にレンダリングされません。標準のディスプレイでは、位置とサイズを整数にする必要があります (分数にすることはできません)。Retina ディスプレイの場合、半分のポイントを使用することで回避できますが、通常は整数のままにしておく方が簡単です。

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 なしで実行している場合は、 and を使用できますfloor/floorf(ceil/ceilfを使用しているf場合はバリアントを使用CGFloats)

編集: CoreGraphics はポイントではなくピクセルで動作することを忘れないでください。そのため、計算では倍率を考慮する必要があります。ありがたいことに、CoreGraphics を使用すると、それが思ったよりも少し簡単になります。コンテキストを作成した直後にこれを挿入するだけです。これにより、そのコンテキスト内での将来の計算に対して正しいスケールが設定されます。

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

テキストの配置に関しては、これは簡単ではありません。手動で (20,20) に設定すると、最初の文字の左上隅の位置が設定されます。これにより、テキストが中央に配置される可能性は低くなります。ただし、レンダリングされたテキストの幅と高さがわからないため、左上隅の位置を補正してテキストを中央に配置することはできません。ここで苦労しますが、レンダリングされたテキストの幅と高さが分かれば、これと画像の幅/高さを使用して正しい位置を計算できます。

于 2013-08-22T22:20:42.237 に答える