سؤال

هل هناك طريقة للحصول على خطوط متعددة من النص في UILabel كما هو الحال في UITextView أو يجب أن أستخدم الثانية بدلا من ذلك؟

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

المحلول

لقد وجدت حلا.

واحد فقط لديه لإضافة التعليمات البرمجية التالية:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

تمت استعادة الإجابة القديمة (للرجوع إليها وتطويرها على استعداد لدعم نظام التشغيل iOS أقل من 6.0):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

على الجانب: كلاهما قيم العدد 0 على أي حال.

نصائح أخرى

في IB، اضبط عدد الخطوط إلى 0 (يسمح بخطوط غير محدودة)

عند الكتابة داخل حقل النص باستخدام IB، استخدم "ALT-RETURN" لإدراج عودة والانتقال إلى السطر التالي (أو يمكنك نسخ في نص مفصول بالفعل عن طريق الخطوط).

أفضل الحلول التي وجدتها (إلى مشكلة محبطة خلافا والتي كان يجب حلها في الإطار) تشبه Vaychick's.

مجرد تعيين عدد الأسطر إلى 0 إما IB أو رمز

myLabel.numberOfLines = 0;

سيؤدي ذلك إلى عرض الخطوط المطلوبة ولكنها ستقوم بإعادة وضع العلامة حتى تتمحورها أفقيا (حتى يتم محاذاة خط واحد و 3 خط 3 في وضعهم الأفقي). لإصلاح ذلك إضافة:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

استخدم هذا للحصول على خطوط متعددة من النص UILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

سويفت:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];

إذا كان عليك استخدام:

myLabel.numberOfLines = 0;

خاصية يمكنك أيضا استخدام استراحة سطر قياسي ("\n"), ، في التعليمات البرمجية، لإجبار خط جديد.

يمكنك استخدام \r للذهاب إلى السطر التالي أثناء ملء UILabel استخدام NSString.

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

دعنا نجرب هذا

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

الحل أعلاه لا يعمل في حالتي. أنا أفعل مثل هذا:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}

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

enter image description here

سويفت 3.
قم بتعيين عدد الخطوط الصفرية للحصول على معلومات نصية ديناميكية، سيكون مفيدا للنص المختلفة.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

enter image description here

UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

لبعض الأسباب التي لا تعمل من أجلي في iOS 6 غير متأكد من السبب. حاول ذلك مع واستخدام النص النسب. أي اقتراحات.

حاول استخدام هذا:

lblName.numberOfLines = 0;
[lblName sizeToFit];

يجب أن تحاول هذا:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}

ساعدتني هذه الأشياء

تغيير هذه الخصائص من Uilabel

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

وبينما إعطاء سلسلة الإدخال استخدم n لعرض كلمات مختلفة في خطوط مختلفة.

مثال :

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

يمكنك أن تفعل ذلك عبر لوحة العمل أيضا:

  1. حدد الملصق على وحدة تحكم العرض
  2. في مفتش السمات، قم بزيادة قيمة خيار الخط (اضغط ALT + CMD + 4 لإظهار السمات Inspector)
  3. انقر نقرا مزدوجا فوق الملصق في وحدة تحكم العرض والكتابة أو لصق النص الخاص بك
  4. تغيير حجم الملصق و / أو زيادة حجم الخط بحيث يمكن عرض النص بأكمله

طريقة 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

الآن اتصل ببساطة مثل هذا

myLbl.lblFunction()//Replace your label name 

السابق:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

الطريقة 2:

برمجيا

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

الطريقة الثالثة:

من خلال مجلس الإدارة

لعرض مجموعة أسطر متعددة 0 (صفر)، سيعرض هذا أكثر من سطر واحد في الملصق الخاص بك.

إذا كنت ترغب في عرض خطوط N، قم بتعيين N.

انظر أدناه الشاشة.

enter image description here

إذا كنت ترغب في تعيين الحد الأدنى لحجم الخط للتسمية، انقر فوق autoshrink وحدد خيار الحد الأدنى لحجم الخط

انظر أدناه شاشات

enter image description here

هنا تعيين الحد الأدنى لحجم الخط

السابقين: 9 (في هذه الصورة)

إذا حصلت علامة على المزيد من النص في ذلك الوقت، فسيتم تقليص نص الملصق الخاص بك حتى 9

enter image description here

UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

أجاب بالفعل، ولكن يمكنك القيام بذلك يدويا في لوحة العمل أيضا. ضمن السمات المفتشية للتسمية، يمكنك تغيير فواصل الأسطر إلى Word Wrap (أو Flight Whol).

في هذه الوظيفة تمرسل السلسلة التي تريد تعيينها في تسمية وتمرير حجم الخط بدلا من Self.ActivityFont وتمرير عرض الملصقات بدلا من 235، والآن تحصل على ارتفاع التسمية وفقا لسلسلة الخاص بك. سوف تعمل بشكل جيد.

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

وضع أدناه إما في التعليمات البرمجية أو في لوحة العمل نفسها

label.linebreakmode = nslineBywordWordWord؛ label.numberoflines = 0؛

ومن فضلك لا تنسى أن تضع قيود اليسار والأيمن والأعلى والسفلية للتسمية وإلا لن تعمل.

SWIFT 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

على C #، هذا عملت بالنسبة لي في الداخل القيميتين.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

أعتقد أن النقطة هنا هي: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

هذا الرمز هو ارتفاع حجم الارتفاع وفقا للنص

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top