سؤال

دعني أرى أن لدي سلسلة تبدو هكذا:

NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";  

كيف أقوم بذلك حتى يعرض uilabel الرسالة مثل هذه

AAAAA
BBBBB
CCCCC

لا أعتقد \n يتم التعرف عليه من قبل Uilabel ، فهل هناك أي شيء يمكنني وضعه داخل NSString بحيث يعرف Uilabel أنه يتعين عليه إنشاء خط استراحة هناك؟

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

المحلول

يستخدم \n كما تستخدم في السلسلة الخاصة بك.

قم بتعيين NumberOflines على 0 للسماح بأي عدد من الخطوط.

label.numberOfLines = 0;

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

UILabel *label; // set frame to largest size you want
...
CGSize labelSize = [label.text sizeWithFont:label.font
                          constrainedToSize:label.frame.size
                              lineBreakMode:label.lineBreakMode];
label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

تحديث: استبدال للتراجع

sizeWithFont:constrainedToSize:lineBreakMode:

المرجعي، بديل لـ Sizewithfont المهملة: في iOS 7؟

CGSize labelSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

نصائح أخرى

enter image description here

استخدم خيار العودة عند الكتابة في المربع الصغير في Builder Interface لإدراج خلاصة خط ( n). في سمات تسمية Builder Interface ، اضبط # الخطوط = 0.

حدد التسمية ثم قم بتغيير خاصية الخطوط إلى 0 كما في الصورة أعلاه ، ثم استخدم n في سلسلتك لكسر الخط.

إذا قرأت سلسلة من ملف XML ، فترسة من السطر \n في هذه السلسلة لن تعمل في UILabel نص. ال \n لا يتم تحليله إلى استراحة خط.

هذه خدعة صغيرة لحل هذه المشكلة:

// correct next line \n in string from XML file
NSString *myNewLineStr = @"\n";
myLabelText = [myLabelText stringByReplacingOccurrencesOfString:@"\\n" withString:myNewLineStr];

myLabel.text = myLabelText;

لذلك عليك أن تحل محل غيرها \n جزء في سلسلة الخاص بك بواسطة تحليل \n في متشددين NSString.

فيما يلي إعدادات التسمية الأخرى:

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

الأهم من ذلك هو تعيين numberOfLines إلى 0 (= عدد غير محدود من الخطوط في التسمية).

لا فكرة لماذا اختارت Apple عدم تحليلها \n في الأوتار قراءة من XML؟

أتمنى أن يساعدك هذا.

في منشئ الواجهة ، يمكنك الاستخدام كنترول + يدخل لإدخال /n إلى الموقف الذي تريده. بهذه الطريقة يمكن أن تنفذ الموقف التالي

AAA
AAAAAAA

عليك تعيين ملف numberOfLines خاصية على UILabel. الافتراضي هو 1, ، إذا قمت بتعيينها على 0 سوف يزيل جميع الحدود.

من المهم أن نلاحظ أنه \n (backslash) بدلا من /n.

في Swift 2.2 ،> iOS 8

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

 @IBOutlet weak var listLabel: UILabel!

 override func viewDidLoad() {
      ...
      listLabel.text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"
 }

// لا تنسى ضبط الرقم على الصفر

UILabel* locationTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 30, 230, 40)];
locationTitle.font = [UIFont systemFontOfSize:13.0];
locationTitle.numberOfLines = 0;
locationTitle.text = [NSString stringWithFormat:@"Eaton industries pvt. Ltd \nUK Apr 12"];
[cell addSubview:locationTitle];

فقط افعل ذلك هكذا

NSString * strCheck = @"A\nB";

strCheck = [strCheck stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];  //This is to prevent for fetching string from plist or data structure

label.numberOfLines = 0;

label.lineBreakMode = NSLineBreakByWordWrapping;

label.text = strCheck;

إذا كنت تستخدم أ UILabel عليك أن تتذكر أن الإعداد الافتراضي هو سطر واحد ، لذلك لا يهم عدد الفواصل التي تضيفها (\n أو \r) ، تحتاج إلى التأكد من ضبطه على أكثر من سطر واحد بحيث يمكن السماح له بإلحاق المزيد من الخطوط.

بديل واحد هو الاستخدام UITextView وهو ما يعنيه حقا لمتعددات.

يمكنك بسهولة تحقيق ذلك في قسم سمات Xcode في Uilabel ، انظر لقطة الشاشة:

enter image description here

على Xcode 6 ، يمكنك فقط استخدام n حتى داخل سلسلة عند استخدام Word Wrap. سوف تعمل. على سبيل المثال:

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, screenRect.size.width, 50)];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"This will be on the first line\nfollowed by a line under it.";
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

فقط باستخدام label.numberOfLines = 0;

في حالتي أيضًا ، لم تكن تعمل ، لقد قمت بإصلاح المشكلة عن طريق الحفاظ على عدد الخطوط إلى 0 ونسخها ولصقها بخط جديد على سبيل المثال بدلاً من Hello n الذي قمت بلصقه

مرحبًا

العالمية

في باني الواجهة.

textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);

لأي شخص آخر قد يواجه مشكلة sizeWithFont:constrainedToSize:lineBreakMode: أو أي شخص يتحول إلى iOS8 (يتم إهمال الطريقة اعتبارًا من iOS7) ، قمت بتعديل طولي باستخدام sizeToFit في حين أن.

UILabel *label;
label.numberOfLines = 0;
// Setup label with desired settings
...
[label sizeToFit];
label.frame = CGRectMake(label.frame.origin.x,     // Or use any desired origin
                         label.frame.origin.y, 
                         label.frame.size.width,   // Or use any desired width
                         label.frame.size.height);
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];

يبدو لي من الخطأ تغيير أحجام إطار الملصقات خاصة عند استخدام Autolayout. استخدام طريقة AppendFormat يبدو أكثر ملاءمة. هنا مثال:

NSMutableString *list = [[NSMutableString alloc] init];
NSArray *textArray = @[@"AAAA", @"BBBB"];
for (NSString *string in textArray) {
    [list appendFormat:@"%@\n", string.mutableCopy];
}
self.label.text = list;
self.label.numberOfLines = 0;

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

لقد واجهت نفس المشكلة ، وهنا ، كيف حللت المشكلة. آمل أن يكون هذا مفيدًا لشخص ما.

// سويفت 2

   lblMultiline.lineBreakMode = .ByWordWrapping // or use NSLineBreakMode.ByWordWrapping
   lblMultiline.numberOfLines = 0 

// ج موضوعية

  lblMultiline.lineBreakMode = NSLineBreakByWordWrapping;
  lblMultiline.numberOfLines = 0;

// C# (xamarin.ios)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top