iOS: كيف يمكنك قياس عرض وارتفاع سلسلة باستخدام الكوارتز؟

StackOverflow https://stackoverflow.com/questions/913470

سؤال

قبل أن أطرح أسئلتي، هذا من وثائق Apple Re: كيفية تحديد عرض سلسلة باستخدام الكوارتز:

إذا كانت قياسات النص مهمة لتطبيقك، فمن الممكن حسابها باستخدام وظائف الكوارتز 2D. ومع ذلك، قد تنظر أولا في استخدام Atsui، التي تكون قوتها في تخطيط النص والقياس. لدى ATSUI العديد من الوظائف التي تحصل على مقاييس نصية. لا يمكنك فقط الحصول على مقاييس نصية بعد التخطيط، ولكن في الحالات النادرة التي تحتاجها، يمكنك الحصول على مقاييس نصية قبل التخطيط. بخلاف الكوارتز، التي يجب عليك تنفيذ الحسابات بنفسك، يحسب ATSUI القياسات المناسبة لك. على سبيل المثال، يمكنك الحصول على صورة ملزمة المستطيل للنص عن طريق استدعاء وظيفة Atsui AtsumeasuretextImage.

إذا قررت أن نص الكوارتز يناسب احتياجاتك أفضل من ATSUI (أو Cocoa)، فيمكنك اتباع هذه الخطوات لقياس عرض النص قبل توجيه الكوارتز:

  1. استدعاء الوظيفة CGCONTEXTETTPOSITION للحصول على موقف النص الحالي.
  2. قم بتعيين وضع الرسم النصي على kcgtextinvisible باستخدام وظيفة CGCONTEXTETTEXTDRAWINGMODE.
  3. ارسم النص عن طريق استدعاء الوظيفة CGCONTEXTSHOWTEXT لرسم النص في موضع النص الحالي.
  4. تحديد موضع النص النهائي عن طريق استدعاء الوظيفة CGCONTEXTTETTPORITION.
  5. طرح موضع البداية من وضع النهاية لتحديد عرض النص.

إليك أسئلتي:

  1. هل هذه هي أفضل طريقة لتحديد عرض سلسلة باستخدام الرسومات الأساسية؟ يبدو واهيا ولأن نصي النصي مع عناصر رسومية ثنائية الأبعاد، أود استخدام نفس السياق لجميع التقديم. كنت آمل أن تكون هناك طريقة مدمجة، مثل:

    CGContextGetTextWidthAndHeight(context, text);
    
  2. قرأت أن Atsui قديم وسيحل محل النص الأساسي. هل هذا صحيح وإذا كان الأمر كذلك، هل هو في iOS؟

هل كانت مفيدة؟

المحلول

على جهاز iPhone SDK، هناك عائلة من الأساليب NSString التي توفر ما تريد.

اعتبارا من iOS 7.0، هذه الأساليب:

- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:

على الإصدارات القديمة من IOS كان لدينا هذه، وإهمال الآن:

– sizeWithFont:  
– sizeWithFont:forWidth:lineBreakMode:  
– sizeWithFont:constrainedToSize:  
– sizeWithFont:constrainedToSize:lineBreakMode:  
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

نصائح أخرى

عند إجراء عمليات الرسم على خيوط أخرى غير مؤشر ترابط UI، يجب عليك استخدام التقنية التي وصفتها. هذا مهم بشكل خاص أن نلاحظ عند استخدام أشياء مثل CatileDlayer، والتي تنفذ أنها تقدم بشكل غير متزامن على خيوط الخلفية، أو عند رسم رسومات مخصصة في الخلفية لأي سبب آخر.

وأنا أتفق مع PGB عند قيامك بعمل رسومات "بسيطة" وأنت مضمون لتشغيله على الخيط الرئيسي. ومع ذلك، يقوم SizeWithfont بعمل نفس الشيء مثل التقنية التي وصفتها - إنها ببساطة تفعل ذلك من أجلك باستخدام UigraphicsgetCurrentContext ().

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