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
5
A
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
- 1. Obtener ancho de la última línea de UILabel UILabel
- 2. Determine el ancho de un ancho DIV dinámico Multivolpea de DIV 3 ancho de columna fijo
- 3. Justificar texto en UILabel iOS
- 4. UILabel con ancho fijo y altura flexible
- 5. iOS - UILabel cambia el aspecto de una etiqueta desactivada
- 6. Ancho de línea OpenGL
- 7. truncamiento de cola uilabel
- 8. Java2D: aumentar el ancho de línea
- 9. ggplot - Cambiar el ancho de línea
- 10. cálculo dinámico del ancho de UILabel en UITableViewCell
- 11. Eliminar último carácter/línea
- 12. No se puede obtener UIAutomation iOS UILabel valor
- 13. Ancho de línea en raphaeljs
- 14. iOS AutoLayout: obtenga el ancho del marco
- 15. Determine el ancho de la cadena en el lienzo de HTML5
- 16. Animación de UILabel con CoreAnimation/QuartzCore en la aplicación iOS
- 17. ¿Cómo obtener texto de la enésima línea de UILabel?
- 18. ¿Cómo calcular el ancho de UILabel en función de la longitud del texto?
- 19. Opacidad diferente para UILabel y el texto de UILabel
- 20. Formato de ancho de línea estándar
- 21. ¿Ancho en línea para ancho de img o css?
- 22. Determine qué tan ancho es un carácter procesado en .NET
- 23. Saltos de línea que no funcionan en UILabel
- 24. Se ignora el salto de línea en UILabel en la compilación
- 25. Top alineado UILabel, hace el palillo de texto al principio de la etiqueta de vista -ios
- 26. Lienzo HTML5 y ancho de línea
- 27. Mover al carácter de fin de línea en Vi, pasar el último carácter en la línea
- 28. Determine el motivo de System.AccessViolationException
- 29. UILabel/NSTextView vs. CATextLayer
- 30. ¿Cómo establecer el ancho de un elemento en línea?
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
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
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