سؤال

وأنا أحاول لقياس حجم البصرية من NSString أن يأخذ بعين الاعتبار عدد خطوط أستطيع تقديم. ومع ذلك، sizeWithFont لا يأخذ بعين الملكية numberOfLines حساب؟ حتى بلدي خوارزمية تخطيط مناصب كل شيء أقل مما يحتاجون فعلا أن يكون.

_price = [[UILabel alloc] init];
_price.text = myPriceValue;
_price.lineBreakMode = UILineBreakModeWordWrap;
_price.numberOfLines = 3;
_price.backgroundColor = [UIColor clearColor];
_price.textColor = TTSTYLEVAR(colorPrice);
/// the follow code ignores numberOfLines and just tells me the size of the whole block.  
// I'd like it to be aware of numberOfLines
//
CGSize priceSize = [_price.text sizeWithFont:_price.font
        constrainedToSize:CGSizeMake(maxWidth, CGFLOAT_MAX)
        lineBreakMode:UILineBreakModeWordWrap];

لا أحد يعرف كيفية القيام بذلك باستخدام SDK فون؟

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

المحلول

وبدلا من CGFLOAT_MAX لارتفاع أقصى حساب النص، حاول الحصول على حجم خط واحد مع هذا:

[_price.text sizeWithFont:_price.font].height

ووثم ضرب ذلك من خلال الحد الأقصى لل# خطوط الذي تريده، ثم توصيل ذلك إلى ارتفاع حجم كنت تقييد نفسك ل. انها تريد ربما تبدو مثل هذا:

_price = [[UILabel alloc] init];
_price.text = myPriceValue;
_price.lineBreakMode = UILineBreakModeWordWrap;
_price.numberOfLines = 3;
_price.backgroundColor = [UIColor clearColor];
_price.textColor = TTSTYLEVAR(colorPrice);
CGFloat lineHeight = [_price.text sizeWithFont:_price.font].height;
CGSize priceSize = [_price.text sizeWithFont:_price.font
        constrainedToSize:CGSizeMake(maxWidth, lineHeight * _price.numberOfLines)
        lineBreakMode:UILineBreakModeWordWrap];

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

نصائح أخرى

استخدم sizeToFit وUILabel بدلا من sizeWithFont: لتخطيط خط متعددة UILabel، منذ sizeWithFont: سوف اقتطاع سلسلة (انظر مستندات التفاح). التعليمة البرمجية التالية يقلل من حجم الخط من تسمية حتى تناسب النص في الحجم المحدد ... وسيتم استخدام عدة أسطر من النص في أقرب وقت لأنها تنسجم مع الارتفاع المحدد:

-(void)setFontSizeOfMultiLineLabel: (UILabel*)label 
        toFitSize: (CGSize) size 
        forMaxFontSize: (CGFloat) maxFontSize 
        andMinFontSize: (CGFloat) minFontSize 
        startCharacterWrapAtSize: (CGFloat)characterWrapSize{

CGRect constraintSize = CGRectMake(0, 0, size.width, 0);
label.frame = constraintSize;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0; // allow any number of lines

for (int i = maxFontSize; i > minFontSize; i--) {

    if((i < characterWrapSize) && (label.lineBreakMode == UILineBreakModeWordWrap)){
        // start over again with lineBreakeMode set to character wrap 
        i = maxFontSize;
        label.lineBreakMode = UILineBreakModeCharacterWrap;
    }

    label.font = [label.font fontWithSize:i];
    [label sizeToFit];
    if(label.frame.size.height < size.height){
        break;
    }       
    label.frame = constraintSize;
  } 
}

وادع هذه مع التسمية التي لديها النصوص المفضل لديك والخط:

UILabel *label = [[UILabel alloc] initWithFrame: CGRectZero];   
label.backgroundColor = [UIColor clearColor];   
label.textColor = [UIColor whiteColor];
label.text = text;
label.font = [UIFont fontWithName: @"Helvetica" size: 16];
[self setFontSizeOfMultiLineLabel: label toFitSize: CGSizeMake(200, 44) forMaxFontSize: 16 andMinFontSize: 8 startCharacterWrapAtSize: 11]; 

والمعلمة startCharacterWrapAtSize يتيح لك اختيار لاستخدام characterWrap بدءا من حجم الخط العطاء. وهذا ينبغي توفير مساحة في حالة أن رجوع الى السطر استخدام خطوط صغيرة حقا.

وتحرير: خلل

وبدلا من محاولة القيام بذلك في مكالمة واحدة، لا شيء من هذا القبيل (العفو شبة الكود، بعد فوات):

NSString *s = _price.text;
UIFont *font = _price.font;
CGFloat fontSize = font.pointSize;

while (TRUE)
{
   CGSize priceSize = [s sizeWithFont: font constrainedToSize: 
       CGSizeMake(maxWidth, fontSize) lineBreakMode: UILineBreakModeWordWrap];

    if ( /* priceSize is satisfactory */ )
    {
        break; // Make sure this exits, eventually!!!
    }
    fontSize -= 1.0; // or a smaller decrement if you like
    font = // new, smaller font

}

والجواب الصحيح هو، بطبيعة الحال، تحتاج إلى تعيين numberOfLines إلى 0، والذي يؤدي إطار لحساب النتيجة مع ذلك العديد من خطوط التي يحتاجها. انظر أيضا هذا السؤال .

وبطبيعة الحال لأنها لا تأخذ بعين الاعتبار، لأن لا شيء يطلق عليه او تمريره في ديه تلك المعلومات. كنت تعمل بدقة مع سلاسل، والأحجام، والخطوط. انها التسمية التي لديها عدد الأسطر في ذلك.

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

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