2016-04-09 17 views
3

Ich schreibe einen erweiterbaren TableView-Header, ich muss die Höhe des Headers genau in TableView Delegate-Methode festlegen. Ich bin jetzt die folgende Methode unter Verwendung der Höhe meines Header (ein mehrzeiliges Etikett) zu berechnen:Wie bekomme ich genau die Höhe von UILabel mit Zeilenabstand?

CGRect calcuRect = [headerText boundingRectWithSize:CGSizeMake(myLabelWitdh, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:myLabelFont} context:nil]; 
CGFloat headerHeight = calcuRect.size.height; 

Allerdings habe ich festgestellt, dass die Höhe berechnet, ohne nur um den Text enthalten Zeilenabstand . Also, wie kann ich die Zeilenhöhe des Etiketts bekommen? oder wie bekommt man eine genaue Höhe von UILabel mit Zeilenabstand?

+0

Wer versteht mich? So erhalten Sie value = wordsTotalHeight + (lineNum-1) * lineSpace. Diese Methode gibt die wordsTotalHeight zurück, aber wie erhält man den Wert von lineSpace? – ZyusAn

Antwort

4

Sie können die genaue Höhe von UILabel bekommen mit genau der gleichen Schriftgröße und -art vorbei und einige Berechnungen zu tun.
Hier habe ich eine UILabel mit Helvetica-Schrift mit Schriftgröße 16.

Objective C

- (CGFloat)requiredHeight:(NSString*)labelText{ 

    UIFont *font = [UIFont fontWithName:@"Helvetica" size:16.0]; 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, CGFLOAT_MAX)]; 
    label.numberOfLines = 0; 
    label.lineBreakMode = NSLineBreakByWordWrapping; 
    label.font = font; 
    label.text = labelText; 
    [label sizeToFit]; 
    return label.frame.size.height; 

} 

Ausgabe

CGFloat size = [self requiredHeight:@"iOS Rocks"]; 
NSLog(@"%f",size); 

size = [self requiredHeight:@"iOS Rocks\n"]; 
NSLog(@"%f",size); 

Konsolenausgabe

2016-04-10 01:37:46.812 testPro[6093:327503] 18.500000 
2016-04-10 01:37:46.814 testPro[6093:327503] 37.000000 

Swift 2,2

func requiredHeight(labelText:String) -> CGFloat { 

    let font = UIFont(name: "Helvetica", size: 16.0) 
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, 200, CGFloat.max)) 
    label.numberOfLines = 0 
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    label.font = font 
    label.text = labelText 
    label.sizeToFit() 
    return label.frame.height 

} 

bearbeiten
Swift 3,0

func requiredHeight(labelText:String) -> CGFloat { 

    let font = UIFont(name: "Helvetica", size: 16.0) 
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: .max)) 
    label.numberOfLines = 0 
    label.lineBreakMode = .byWordWrapping 
    label.font = font 
    label.text = labelText 
    label.sizeToFit() 
    return label.frame.height 

} 
+0

@ZyusAn Hat es für dich funktioniert? –

+0

Danke, hilft wirklich – ZyusAn

0

Sie müssen die Größe des Etikettenrahmens ändern. Versuche: [label sizeToFit];

+0

nicht über sizeToFit, möchte ich nur die genaue Höhe des Multi-Label – ZyusAn

0

Verwenden Sie die folgenden Methoden für die gleichen.

- (CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font withText:(NSString *)aStrText 
{ 
    CGSize labelSize = (CGSize){width, FLT_MAX}; 
    CGRect rect = [aStrText boundingRectWithSize:labelSize 
             options:NSStringDrawingUsesLineFragmentOrigin 
             attributes:@{NSFontAttributeName : font} 
             context:nil]; 
    return rect.size.height; 
} 
+0

wissen das Problem ist, diese Methode nur die Höhe der Wörter, nicht einschließlich der Zeilenabstand zurück, wenn das Etikett mehrere Zeilen hat, wird diese Höhe kleiner sein als die tatsächliche Höhe. – ZyusAn

0
override func viewDidLayoutSubviews() { 
      super.viewDidLayoutSubviews() 
      sizeToFit() 

     } 
     func sizeToFit(){ 
      let header = customHeaderView 
      let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height; 
      var headerFrame = header.frame 

      headerFrame.size.height = height 
      header.frame = headerFrame 
      tableView.tableHeaderView = header; 



    } 
Hope this will help you. 
0

In der Tat, ich möchte einen erweiterbaren Abschnitt Header in meiner Tabelle Ansicht erstellen, jedoch in der Delegatmethode:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 

dies erfüllt hod muss die exakte Höhe meines Etikettenheaders zurückgeben, ich verwende die folgende Methode, um die Höhe zu berechnen, die Höhe enthält jedoch keinen Zeilenabstand, sondern nur die Worthöhe;

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary<NSString *, id> *)attributes context:(NSStringDrawingContext *)context; 

Seit mehr über sizeToFit wissen, hier ist eine mögliche Antwort

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self tableViewInit]; 
    [self headerInit]; 
} 

- (void)tableViewInit { 
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
    [self.view addSubview:_tableView]; 
    self.tableView.dataSource = self; 
    self.tableView.delegate = self; 
} 

- (void)headerInit { 
    CGRect originSize = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, CGFLOAT_MIN); 
    self.header = [[UILabel alloc] initWithFrame:originSize]; 
    self.header.lineBreakMode = NSLineBreakByWordWrapping | NSLineBreakByTruncatingTail; 
    self.header.text = self.headerStr; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    if (self.showAll) { 
     self.header.numberOfLines = 0; 
     [self.header sizeToFit]; 
    } else { 
     self.header.numberOfLines = 2; 
     [self.header sizeToFit]; 
    } 
    return self.header.bounds.size.height; 
} 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    return self.header; 
} 
0

Basierend auf Rajan Maheshwari Antwort, die ich diese Funktion in Swift 3.0 für eine generische Bezeichnung mit der optionalen Zeilenhöhe geschrieben. Ich hoffe es hilft.

func heightForLabel(_ text: String, font: UIFont, width: CGFloat, lineSpacing: CGFloat) -> CGFloat { 
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude)) 
    label.numberOfLines = 0 
    label.lineBreakMode = NSLineBreakMode.byWordWrapping 
    label.font = font 
    if lineSpacing > 0.0 { 
     let style = NSMutableParagraphStyle() 
     style.lineSpacing = lineSpacing 
     style.alignment = .center 
     label.attributedText = NSAttributedString(string: text, attributes: [NSParagraphStyleAttributeName: style]) 
    } else { 
     label.text = text 
    } 
    label.sizeToFit() 
    return label.frame.height 
} 
Verwandte Themen