سؤال

لم NSString أريد أن عرض أكثر من بضع صفحات.

ولكن للقيام بذلك ، أنا بحاجة إلى معرفة مقدار نص تناسب الواقع على الصفحة.

[NSString sizeWithFont:...] لا يكفي فقط أن تقول لي إذا كان يناسب النص في مستطيل أو لا, إذا لا, بصمت سيتم اقتطاع السلسلة ، لكنها لن تقول لي أين هو اقتطاع!

أريد أن أعرف الكلمة الأولى التي لا تناسب على الصفحة ، لذا يمكن تقسيم سلسلة رسم هذا الجزء من على الصفحة التالية.(و أكرر)

أي أفكار عن كيفية حل هذا ؟

فقط فكرة أنا نفسي حتى الآن هو الدعوة مرارا sizeWithFont:constrainedToSize:حول نقطة في السلسلة و التي أعتقد الصفحة كسر سوف يكون وتحليل الناتجة rect لكن يبدو انها مرهقة وبطيئة أشعر أنني قد الإضافية مشاكل في الحصول على 100 ٪ دقيقة...(بسبب والأسلة ، وغيرها.)

ofc ، فإنه يجب أن تكون متاحة في العام دائرة الرقابة الداخلية SDK

الجواب:

تفو أن كان بعض شعر الوثائق.هنا هو بلدي الانتهاء وظيفة كمثال, ربما أنها سوف تساعد شخص ما ، بما أن ليس هناك اي فون محددة الأساسية أمثلة النص هناك.

+ (NSArray*) findPageSplits:(NSString*)string size:(CGSize)size font:(UIFont*)font;
{
  NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:32];
  CTFontRef fnt = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize,NULL);
  CFAttributedStringRef str = CFAttributedStringCreate(kCFAllocatorDefault, 
                                                       (CFStringRef)string, 
                                                       (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:(id)fnt,kCTFontAttributeName,nil]);
  CTFramesetterRef fs = CTFramesetterCreateWithAttributedString(str);
  CFRange r = {0,0};
  CFRange res = {0,0};
  NSInteger str_len = [string length];
  do {
    CTFramesetterSuggestFrameSizeWithConstraints(fs,r, NULL, size, &res);
    r.location += res.length;
    [result addObject:[NSNumber numberWithInt:res.length]];
  } while(r.location < str_len);
//  NSLog(@"%@",result);
  CFRelease(fs);
  CFRelease(str);
  CFRelease(fnt);
  return result;
}  

ملاحظة هامة:

لا يمكنك استخدام عادت مجموعة أو الحجم مع أي UIKit الطبقات أو سلسلة الرسم وظائف!يجب استخدامه فقط مع جوهر النص ، على سبيل المثال إنشاء CTFrame و الرسم.الاختلافات الطفيفة في أشياء مثل تقنين يجعل من المستحيل الجمع بين جوهر النص الوظائف مع UIKit.

لاحظ أيضا أن عاد الحجم وقد وجد أن تكون عربات التي تجرها الدواب.

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

المحلول

يجب أن ننظر إلى CoreText المتاحة منذ دائرة الرقابة الداخلية 3.2.مستندات معقدة نوعا ما و يمكن العثور عليها هنا.أساسا يمكنك إنشاء CTFramesetter والدعوة CTFramesetterSuggestFrameSizeWithconstraints.ثم سوف تجد مجموعة من النصوص التي تناسبها في CGSize.

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