سؤال

حالة غريبة - أمثلة من أعمال Apple، ولكن بعد أن أغيرها قليلا، لا يتم عرض النص. يعتمد هذا القليل من الكود بشكل صحيح على الخلفية الزرقاء ولكن يرفض رسم نص على ذلك بغض النظر عن ما أقوم به:

#import <UIKit/UIKit.h>

@interface CWnd : UIWindow @end
@implementation CWnd

- (void) drawRect : (CGRect) i_poRect
{
  // This is working : windows is blue.
  CGContextRef oContex = UIGraphicsGetCurrentContext();
  CGContextSetRGBFillColor( oContex, 0, 0, 255, 1 );
  CGContextFillRect( oContex, i_poRect );
  // This is not working : not text is displayed.
  CGContextSelectFont( oContex, "Monaco", 10, kCGEncodingFontSpecific );
  CGContextSetRGBStrokeColor( oContex, 255, 0, 0, 1 ); 
  CGContextSetRGBFillColor( oContex, 255, 0, 0, 1 ); 
  CGContextSetTextDrawingMode( oContex, kCGTextFill );
  CGContextSetTextPosition( oContex, 100, 100 );
  CGContextShowText( oContex, "abc", 3 );
}

@end

@interface CDelegate : NSObject <UIApplicationDelegate> @end
@implementation CDelegate

- (void)applicationDidFinishLaunching : (UIApplication *) i_poApp
{
  CGRect oRect = [ [ UIScreen mainScreen ] bounds ];
    [ [ [ CWnd alloc] initWithFrame : oRect ] makeKeyAndVisible ];
}

@end

int main(int argc, char *argv[])
{    
  return UIApplicationMain( argc, argv, nil, @"CDelegate" );
}
هل كانت مفيدة؟

المحلول

لقد استخدمت الشفرة التالية دون مشكلة في رسم النص مباشرة إلى سياق الكوارتز:

CGContextSetStrokeColorWithColor(context, strokeColor); 
CGContextSetFillColorWithColor(context, strokeColor);

CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetTextPosition(context, 0.0f, round(fontSize / 4.0f));
CGContextShowText(context, [text UTF8String], strlen([text UTF8String]));

ليس من الواضح ما يحدث في قضيتك. هناك شيئان نشوض به في هذه الحالة: قد يرسم النص رأسا على عقب بسبب مساحة الإحداثيات المنطقية من Uiviews و Calayers، وكما يشير فنجان إيقاعي، هذا لا يتعامل مع ترميزات UTF.

أفضل، على الرغم من أقل أداء، والنهج هو أن تفعل شيئا مثل:

CGContextSetFillColorWithColor(context, strokeColor);
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]];

نصائح أخرى

مهلا، لقد وجدت للتو ملاحظة في التعليمات البرمجية الخاصة بي.

فيما يبدو CGContextShowTextAtPoint لا يعمل مع CGContextSetFont.
تحتاج إلى استخدام بدلا من ذلك CGContextSelectFont. وبعد واضح، هاه؟

على أي حال، أعرف أن هذا ليس هو الحال، ولكن يمكنك محاولة استخدام CGContextShowTextAtPoint.

ربما لم ينتمي هذا إجابة منفصلة.

أشخاص أخرون (هنا و هنا) لقد فعلت بعض التحولات الآفية واستخدمت CGContextShowTextAtPoint الطريقة من أجل جعلها تعمل:

CGContextSelectFont(oContex, @"Monaco", 10, kCGEncodingFontSpecific);
CGContextSetTextDrawingMode(oContex, kCGTextFill);
CGContextSetRGBFillColor(oContex, 1.0, 0.0, 0.0, 1.0);
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(oContex, xform);
CGContextShowTextAtPoint(oContex, 100, 100, "abc", 3);

مشكلة واحدة محتملة واحدة هي أن CGContextSetRGBFillColor الطريقة تأخذ الوسائط العائمة في النطاق 0.0 إلى 1.0. أنت تستخدم 255 للإشارة إلى "اللون الكامل"، وهو ما لا يتوقعه هذه الطريقة. يجب أن تعمل ما يلي، إذا كنت أكثر راحة مع نطاق 0 إلى 255:

CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0);

مهلا، يمكن أن يكون مشكلة ترميز.

حاول التغيير kCGEncodingFontSpecific ل kCGEncodingMacRoman.

في وقت لاحق عندما تحصل عليه كل العمل، تخلص من CGContextShowTextAtPoint.
إنه القمامة وغير Unicode واستخدام إصدارات Glyph التي ستحتاج إليها
استدعاء APIS المحرم. أنت أفضل حالا عن استخدام Uikit للرسم النصي.
انها unicode savvy وأيضا هل يلحق استبدال الجليف اللائق للشخصيات
التي ليست موجودة في خطك.

هناك احتمال آخر وهذا هو أن وضع النص الذي تحدده يقع خارج المستطيل الذي تحاول رسمه فيه. من السهل اختبار ذلك عن طريق استبدال

CGContextSetTextPosition( oContex, 100, 100 );

مع

CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));

استخدم طريقة CGCONTEXTETTEXTMATRIX. "المشكلة رأسا على عقب" هي من المصفوفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top