2012-04-17 12 views
5

chicos! Tengo una etiqueta con varias líneas, lineBreakMode está configurado en UILineBreakModeWordWrap. ¿Cómo puedo determinar el ancho de la última línea? GraciasiOS. ¡Determine el último ancho de línea de UILabel

+0

no sé de ninguna manera de hacer esto. Pero, ¿por qué quieres esto? Tal vez, si sabemos por qué quieres esto, podemos encontrar otra forma de resolver tu problema. – Rob

+2

Podría imaginarme alguna rutina complicada en la que use repetidamente el 'tamañoWithFont: constrainedToSize: lineBreakMode:' de NSString, agregue una palabra a la vez, descubra qué palabra lo empuja a la próxima línea, y luego repita este proceso hasta llegar a la última línea, y luego un 'sizeWithFont: constrainedToSize: lineBreakMode:' final para calcular el ancho de esa línea final. – Rob

+0

Usé ese enfoque, pero parece bastante complicado, así que me pregunté si hay alguna buena solución para el problema. ¡Gracias de todos modos! – leon4ic

Respuesta

5

Así es como lo hice. Primero coloque las líneas de su etiqueta en NSArray, y luego verifique el ancho de la última línea. En viewDidLoad:

NSArray* lines = [self getSeparatedLinesFromLbl:srcLabel]; 
NSString *lastLine=[lines lastObject]; 
float lastLineWidth=[lastLine sizeWithFont:srcLabel.font constrainedToSize:boundingSize lineBreakMode:NSLineBreakByWordWrapping].width; 

Y getSeparatedLinesFromLbl:

-(NSArray*)getSeparatedLinesFromLbl:(UILabel*)lbl 
{ 
if (lbl.lineBreakMode != NSLineBreakByWordWrapping) 
{ 
    return nil; 
} 

NSMutableArray* lines = [NSMutableArray arrayWithCapacity:10]; 

NSCharacterSet* wordSeparators = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 

NSString* currentLine = lbl.text; 
int textLength = [lbl.text length]; 

NSRange rCurrentLine = NSMakeRange(0, textLength); 
NSRange rWhitespace = NSMakeRange(0,0); 
NSRange rRemainingText = NSMakeRange(0, textLength); 
BOOL done = NO; 
while (!done) 
{ 
    // determine the next whitespace word separator position 
    rWhitespace.location = rWhitespace.location + rWhitespace.length; 
    rWhitespace.length = textLength - rWhitespace.location; 
    rWhitespace = [lbl.text rangeOfCharacterFromSet: wordSeparators options: NSCaseInsensitiveSearch range: rWhitespace]; 
    if (rWhitespace.location == NSNotFound) 
    { 
     rWhitespace.location = textLength; 
     done = YES; 
    } 

    NSRange rTest = NSMakeRange(rRemainingText.location, rWhitespace.location-rRemainingText.location); 

    NSString* textTest = [lbl.text substringWithRange: rTest]; 

    CGSize sizeTest = [textTest sizeWithFont: lbl.font forWidth: 1024.0 lineBreakMode: NSLineBreakByWordWrapping]; 
    if (sizeTest.width > lbl.bounds.size.width) 
    { 
     [lines addObject: [currentLine stringByTrimmingCharactersInSet:wordSeparators]]; 
     rRemainingText.location = rCurrentLine.location + rCurrentLine.length; 
     rRemainingText.length = textLength-rRemainingText.location; 
     continue; 
    } 

    rCurrentLine = rTest; 
    currentLine = textTest; 
} 

[lines addObject: [currentLine stringByTrimmingCharactersInSet:wordSeparators]]; 

return lines; 
} 
+0

podría actualizar para ios8 – suthar

1

Swift 3 (IOS 10,3)

extension UILabel { 
    func getSeparatedLines() -> [Any] { 
     if self.lineBreakMode != NSLineBreakMode.byWordWrapping { 
      self.lineBreakMode = .byWordWrapping 
     } 
     var lines = [Any]() /* capacity: 10 */ 
     let wordSeparators = CharacterSet.whitespacesAndNewlines 
     var currentLine: String? = self.text 
     let textLength: Int = (self.text?.characters.count ?? 0) 
     var rCurrentLine = NSRange(location: 0, length: textLength) 
     var rWhitespace = NSRange(location: 0, length: 0) 
     var rRemainingText = NSRange(location: 0, length: textLength) 
     var done: Bool = false 
     while !done { 
      // determine the next whitespace word separator position 
      rWhitespace.location = rWhitespace.location + rWhitespace.length 
      rWhitespace.length = textLength - rWhitespace.location 
      rWhitespace = (self.text! as NSString).rangeOfCharacter(from: wordSeparators, options: .caseInsensitive, range: rWhitespace) 
      if rWhitespace.location == NSNotFound { 
       rWhitespace.location = textLength 
       done = true 
      } 
      let rTest = NSRange(location: rRemainingText.location, length: rWhitespace.location - rRemainingText.location) 
      let textTest: String = (self.text! as NSString).substring(with: rTest) 
      let fontAttributes: [String: Any]? = [NSFontAttributeName: font] 
      let maxWidth = (textTest as NSString).size(attributes: fontAttributes).width 
      if maxWidth > self.bounds.size.width { 
       lines.append(currentLine?.trimmingCharacters(in: wordSeparators) ?? "") 
       rRemainingText.location = rCurrentLine.location + rCurrentLine.length 
       rRemainingText.length = textLength - rRemainingText.location 
       continue 
      } 
      rCurrentLine = rTest 
      currentLine = textTest 
     } 
     lines.append(currentLine?.trimmingCharacters(in: wordSeparators) ?? "") 
     return lines 
    } 

    var lastLineWidth: CGFloat { 
     let lines: [Any] = self.getSeparatedLines() 
     if !lines.isEmpty { 
      let lastLine: String = (lines.last as? String)! 
      let fontAttributes: [String: Any]? = [NSFontAttributeName: font] 
      return (lastLine as NSString).size(attributes:  fontAttributes).width 
     } 
     return 0 
    } 
} 

Uso

print(yourLabel.lastLineWidth) 

Swift 3 (IOS 10,3)

Cuestiones relacionadas