3

テキストを中央に配置しようとしているテーブル ビューの空白のサムネイルを作成する方法があります。

水平方向の中央揃えは、目に見えないテキストを描画するだけで十分簡単ですが、テキストを垂直方向に中央揃えする方法を説明しているようには見えません。私はいくつかの異なることを試しましたが、真に中央揃えのテキストを提供するものはありません。

CGContextShowTextAtPoint()出力テキストが垂直方向に中央揃えになる「y」原点を計算するにはどうすればよいですか?

サンプル画像とメソッドのコードについては、以下を参照してください。

ここに画像の説明を入力

- (UIImage *)blankThumbnail
{
    // Check to see if Blank Thumbnail has already been initialized
    if (_blankThumbnail != nil) {
        return _blankThumbnail;
    }

    // Get Device Scale
    CGFloat scale = [[UIScreen mainScreen] scale];

    // Setup color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    // Create a CGBitmapContext to draw an image into
    NSUInteger width = 66 * scale;
    NSUInteger height = 44 * scale;
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(NULL,
                                                 width,
                                                 height,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

    // Release colorspace
    CGColorSpaceRelease(colorSpace);


    // Set the Fill Area to the full size of context
    CGRect fillArea = CGRectMake(0, 0, width, height);

    // Set Fill Color and Fill Context
    CGContextSetRGBFillColor(context, 200.0f/255.0f, 200.0f/255.0f, 200.0f/255.0f, 1.0f);
    CGContextFillRect(context, fillArea);


    // Set Text String and Size
    NSString *string = @"No Image";
    CGFloat size = 12 * scale;

    // Set up Font
    CGContextSelectFont(context,
                        "Helvetica",
                        size,
                        kCGEncodingMacRoman);

    // Set Fill and Stroke Colors
    CGContextSetRGBFillColor(context, 0, 0, 0, 0.4);
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.4);


    // Set Drawing Mode to Invisible
    CGContextSetTextDrawingMode(context, kCGTextInvisible);

    // Get initial and final positions
    CGPoint initPos = CGContextGetTextPosition(context);
    CGContextShowTextAtPoint (context, initPos.x, initPos.y, string.UTF8String, string.length);
    CGPoint finalPos = CGContextGetTextPosition(context);

    // Calculate height & width, and center text in context
    CGFloat x = (width / 2) - ((finalPos.x - initPos.x) / 2);
    CGFloat y = (height / 2) - (size / 2);


    // Set Drawing Mode to Fill Stroke
    CGContextSetTextDrawingMode (context, kCGTextFillStroke);

    // Draw Text
    CGContextShowTextAtPoint (context, x, y, string.UTF8String, string.length);


    // Get CGImage and set to UIImage
    CGImageRef imageRef = CGBitmapContextCreateImage(context);

    // Release context
    CGContextRelease(context);

    // Set CGImage to UIImage
    _blankThumbnail = [UIImage imageWithCGImage:imageRef];

    // Release Image Ref
    CGImageRelease(imageRef);


    return _blankThumbnail;
}

ありがとう。メソッドに何か問題がある場合は、お知らせください。

4

1 に答える 1

2

私はあなたの方法を変更し、66 x 100 の画像サイズを作成しました。また、非表示オプションを削除しました。

これで、画像テキストが垂直方向に中央揃えで表示されます。どうぞ:

- (UIImage *)blankThumbnail
{
// Check to see if Blank Thumbnail has already been initialized
if (_blankThumbnail != nil) {
    return _blankThumbnail;
}

// Get Device Scale
CGFloat scale = [[UIScreen mainScreen] scale];

// Setup color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// Create a CGBitmapContext to draw an image into
NSUInteger width = 66 * scale;
NSUInteger height = 100 * scale;
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(NULL,
                                             width,
                                             height,
                                             bitsPerComponent,
                                             bytesPerRow,
                                             colorSpace,
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

// Release colorspace
CGColorSpaceRelease(colorSpace);


// Set the Fill Area to the full size of context
CGRect fillArea = CGRectMake(0, 0, width, height);

// Set Fill Color and Fill Context
CGContextSetRGBFillColor(context, 200.0f/255.0f, 200.0f/255.0f, 200.0f/255.0f, 1.0f);
CGContextFillRect(context, fillArea);


// Set Text String and Size
NSString *string = @"No Image";

CGFloat size = 12 * scale;

// Set up Font
CGContextSelectFont(context,
                    "Helvetica",
                    size,
                    kCGEncodingMacRoman);

// Set Fill and Stroke Colors
CGContextSetRGBFillColor(context, 0, 0, 0, 0.4);
CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.4);

for (int i = 0;i < string.length; i++)
{
    NSInteger inc = string.length - i - 1;
    NSRange range;
    range.length = 1;
    range.location = inc;
    NSString *si = [string substringWithRange:range];
    CGSize letterSize = [si sizeWithFont:[UIFont fontWithName:@"Helvetica" size:size]];
    // Calculate height & width, and center text in context
    CGFloat x = (width / 2) - letterSize.width / 2;
    CGFloat y = i * size;


    // Set Drawing Mode to Fill Stroke
    CGContextSetTextDrawingMode (context, kCGTextFillStroke);

    // Draw Text
    CGContextShowTextAtPoint (context, x, y, si.UTF8String, si.length);

}
// Set Drawing Mode to Invisible


// Get initial and final positions


// Get CGImage and set to UIImage
CGImageRef imageRef = CGBitmapContextCreateImage(context);

// Release context
CGContextRelease(context);

// Set CGImage to UIImage
_blankThumbnail = [UIImage imageWithCGImage:imageRef];

// Release Image Ref
CGImageRelease(imageRef);


return _blankThumbnail;
}
于 2013-07-06T22:42:31.967 に答える