خطوط متعددة من النص في Uilabel
-
13-09-2019 - |
سؤال
هل هناك طريقة للحصول على خطوط متعددة من النص في 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);
//...
}
استخدم قصة بوراد: حدد الملصق لتعيين عدد الأسطر إلى الصفر ......أو إحالة هذا
سويفت 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
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];
يمكنك أن تفعل ذلك عبر لوحة العمل أيضا:
- حدد الملصق على وحدة تحكم العرض
- في مفتش السمات، قم بزيادة قيمة خيار الخط (اضغط ALT + CMD + 4 لإظهار السمات Inspector)
- انقر نقرا مزدوجا فوق الملصق في وحدة تحكم العرض والكتابة أو لصق النص الخاص بك
- تغيير حجم الملصق و / أو زيادة حجم الخط بحيث يمكن عرض النص بأكمله
طريقة 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.
انظر أدناه الشاشة.
إذا كنت ترغب في تعيين الحد الأدنى لحجم الخط للتسمية، انقر فوق autoshrink وحدد خيار الحد الأدنى لحجم الخط
انظر أدناه شاشات
هنا تعيين الحد الأدنى لحجم الخط
السابقين: 9 (في هذه الصورة)
إذا حصلت علامة على المزيد من النص في ذلك الوقت، فسيتم تقليص نص الملصق الخاص بك حتى 9
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;
}