Birden fazla metin satırları için bir yolu var mı UILabel
benzerlerinde UITextView
ya da ben onun yerine ikinci bir kullanmalıdır?
Birden fazla metin satırları için bir yolu var mı UILabel
benzerlerinde UITextView
ya da ben onun yerine ikinci bir kullanmalıdır?
Yanıtlar:
Bir çözüm buldum.
Biri sadece aşağıdaki kodu eklemelidir:
// 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;
Geri yüklenen eski yanıt (referans ve 6.0'ın altında iOS'u desteklemek isteyen geliştiriciler için):
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Yanda: her iki enum değeri 0
de yine de verim verir .
cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
vecell.textLabel?.numberOfLines = 0
IB'de satır sayısını 0 olarak ayarlayın (sınırsız satıra izin verir)
IB kullanarak metin alanına yazarken, bir dönüş eklemek ve bir sonraki satıra gitmek için "alt-return" tuşunu kullanın (veya satırlarla ayrılmış metinlere kopyalayabilirsiniz).
Bulduğum en iyi çözüm (çerçevede çözülmesi gereken sinir bozucu bir soruna) vaychick'inkine benzer.
IB veya kodda satır sayısını 0 olarak ayarlamanız yeterlidir
myLabel.numberOfLines = 0;
Bu, gerekli satırları görüntüler ancak etiketi yatay olarak ortalanacak şekilde yeniden konumlandırır (böylece 1 satır ve 3 satır etiketi yatay konumlarında hizalanır). Bu eklentiyi düzeltmek için:
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;
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
Kullanmanız gerekiyorsa:
myLabel.numberOfLines = 0;
özelliği ("\n")
, yeni bir satırı zorlamak için kodda standart bir satır sonu da kullanabilirsiniz .
Hadi bunu deneyelim
textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated
textLabel.numberOfLines = 0;
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Yukarıdaki çözüm benim durumumda çalışmıyor. Ben böyle yapıyorum:
- (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);
//...
}
Swift 3
Dinamik metin bilgileri için satır sayısını sıfır olarak ayarlayın, değişen metinler için yararlı olacaktır.
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;
Bazı nedenlerden dolayı iOS 6'da benim için çalışmıyor, neden olduğundan emin değilim. İlişkilendirilmiş metinle ve ilişkilendirilmemiş metinle denedim. Herhangi bir öneri.
Bunu kullanmayı deneyin:
lblName.numberOfLines = 0;
[lblName sizeToFit];
Bunlar bana yardımcı oldu
UILabel'in bu özelliklerini değiştirin
label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;
Ve String girerken farklı satırlarda farklı kelimeler görüntülemek için \ n kullanın.
Misal :
NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
Yöntem 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
}
}
Şimdi şöyle deyin
myLbl.lblFunction()//Replace your label name
EX:
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
}
}
Yöntem 2:
Programlı
yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping
Yöntem 3:
Hikaye panosu aracılığıyla
Birden fazla satırı 0 (Sıfır) olarak görüntülemek için, etiketinizde birden fazla satır görüntülenir.
N satırını görüntülemek istiyorsanız, n'yi ayarlayın.
Aşağıdaki ekrana bakın.
Etiket için minimum yazı tipi boyutunu ayarlamak istiyorsanız Otomatik Ayarla'yı ve Minimum Yazı Tipi Boyutunu Seç seçeneğini tıklayın
Aşağıdaki ekranlara bakın
Burada minimum yazı tipi boyutunu ayarlayın
EX: 9 (Bu resimde)
Etiketiniz o sırada daha fazla metin alırsa, etiket metniniz 9'a kadar küçülür
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Bunu Storyboard üzerinden de yapabilirsiniz:
bunu denemelisin:
-(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 *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
Bu işlevde, etikette atamak istediğiniz yazı dizesini ve self.activityFont yerine yazı tipi boyutunu geçirin ve 235 yerine etiket genişliğini geçirin, şimdi dizenize göre etiket yüksekliği elde edersiniz. iyi çalışır.
-(float)calculateLabelStringHeight:(NSString *)answer
{
CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
return textRect.size.height;
}
Aşağıda kodda veya film şeridinin kendisinde belirtilmiştir
Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;
ve lütfen etiket için sol, sağ, üst ve alt kısıtlamaları ayarlamayı unutmayın, aksi takdirde çalışmaz.
Hızlı 4:
label.lineBreakMode = .byWordWrapping
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.preferredMaxLayoutWidth = superview.bounds.size.width - 10
C #, bu benim için UITableViewCell içinde çalıştı.
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);
Bence buradaki nokta: -
myLabel.TextAlignment = UITextAlignment.Left;
myLabel.LineBreakMode = UILineBreakMode.WordWrap;
myLabel.MinimumScaleFactor = 1;
myLabel.AdjustsFontSizeToFitWidth = true;
Bu kod metne göre boyut yüksekliğini döndürüyor
+ (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;
}
UILineBreakModeWordWrap
iOS 6. kullanımdan kaldırıldı Artık kullanmalısınızNSLineBreakByWordWrapping = 0
belgelerine bakın burada