0

このコードを使用して、キューから Core Graphics を使用して UILabel (既にサブクラス化したもの) に NSString を描画しますが、画面には何も表示されません。エラーは発生しません。

このような関数をキューから呼び出します。

[label1 createtext];

-(void)createtext
{          
    UIFont *font=[UIFont fontWithName:@"Times New Roman" size:15.0];
    //Core Text (Create Attributed String)

    NSMutableArray *Text=[globaltextarray Text];
    CGSize size=[[Text objectAtIndex:0] sizeWithFont:font];

    if (UIGraphicsBeginImageContextWithOptions != NULL)
        UIGraphicsBeginImageContextWithOptions(size,NO,0.0);
    else
        // iOS is < 4.0
        UIGraphicsBeginImageContext(size);

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    if (ctx != NULL)
        NSLog(@"not null context");
    UIColor *textColor = [UIColor blackColor];
    CGColorRef color = textColor.CGColor;

    CTFontRef font = CTFontCreateWithName((CFStringRef) @"TimesNewRomanPSMT", 15.0, NULL);

    CTTextAlignment theAlignment = kCTLeftTextAlignment;

    CFIndex theNumberOfSettings = 1;
    CTParagraphStyleSetting theSettings[1] = {
        { kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment),
            &theAlignment }
    };

    CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(theSettings, theNumberOfSettings);

    NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:(id)font, (NSString *)kCTFontAttributeName,color, (NSString *)kCTForegroundColorAttributeName,paragraphStyle, (NSString *) kCTParagraphStyleAttributeName,nil];

    NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:[NSString stringWithCString:[[Text objectAtIndex:indexpath1.row] cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding] attributes:attributesDict];

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)stringToDraw);

    //Prepare our view for drawing

    CGContextSetTextMatrix(ctx, CGAffineTransformIdentity);
    CGContextTranslateCTM(ctx, 0, ([self bounds]).size.height );
    CGContextScaleCTM(ctx, 1.0, -1.0);

    //Create Frame
    CGMutablePathRef path = CGPathCreateMutable();
    CGRect rect  = self.frame;
    CGPathAddRect(path, NULL, rect);

    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

    //Draw Frame
    CTFrameDraw(frame, ctx);

    UIGraphicsEndImageContext();
    //Release all retained objects
    CFRelease(framesetter);
    CFRelease(path);
    [stringToDraw release];
}

どんな助けでも大歓迎です!

4

2 に答える 2

1

一時的なグラフィックス コンテキストを作成し、そこに描画してから破棄しています。画面に何かを配置するようUIKitに指示することは決してありません。

次のこと必要です。

  • を使用して、そのコンテキストのコンテンツから画像を作成しますUIGraphicsGetImageFromCurrentImageContext
  • メインスレッドで、その画像をビューに入れるか、画像を別のビューに描画します

例えば:

// In your class's declaration, define an image view to show your drawing.
// Make sure that this view is created (either as part of a storyboard/nib, or with explicit code)
@property (nonatomic) UIImageView *imageView;

- (void)createText
{
    CGSize size = /* you decide */;
    UIGraphicsBeginImageContext(size);

    // draw into the graphics context
    // after you're done:

    UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = image;
    });
}
于 2013-06-29T03:49:14.167 に答える