iphone - uitableviewcell - uitableviewcontroller swift 4
La etiqueta de texto de uitableviewcell es demasiado larga y elimina la etiqueta de texto detallado (11)
¡¡Funciona!! Pero acabo de cambiar el código de Christopher King:
- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font :(NSString*) result
{
while ([result sizeWithFont:font].width > width)
{
result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];
result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
}
return result;
}
y uso:
NSString* text = @"bla bla bla some long text bla bla";
text = [self stringByTruncatingToWidth:cell.frame.size.width-70.0 withFont:[UIFont systemFontOfSize:17] :text];
cell.textLabel.text = text;
Cuando estoy usando UITableViewCellStyleValue1, obtuve una larga cadena de textLabel, y de alguna manera la detailTextLabel se eliminó de la vista.
Cuando acorté mi texto TextLabel, entonces puedo ver el texto detailTextLabel.
¿Hay alguna forma de limitar el ancho de textLabel en el estilo anterior para que trunde el textLabel con demasiado tiempo?
Mi código es:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
//---get the letter in each section; e.g., A, B, C, etc.---
NSString *alphabet = [self.currencyNameIndex objectAtIndex:[indexPath section]];
//---get all states beginning with the letter---
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
self.currencyList = [self.keyCurrencyName filteredArrayUsingPredicate:predicate];
if ([self.currencyList count] > 0)
{
NSString *currencyName = [self.keyCurrencyName objectAtIndex:indexPath.row];
cell.textLabel.text = currencyName;
NSString *currencyCode = [self.valueCurrencyCode objectAtIndex:indexPath.row];
cell.detailTextLabel.text = currencyCode;
}
return cell;
}
así que el nombre de mi moneda será largo en alguna entrada.
1º: establecer el modo de salto de línea
textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
2º: establezca el ancho de marco texLabel que desee (por ejemplo, 200)
CGRect textFrame = self.textLabel.frame;
CGRect newTextFrame = CGRectMake(textFrame.origin.x, textFrame.origin.y, 200, textFrame.size.height);
self.textLabel.frame = newTextFrame;
@Jhaliya @lucas
cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
Ver aquí: UITableViewCell personalizado. Error al aplicar UILineBreakModeTailTruncation
Ajusta el marco de la vista: textLabel
CGRect aFrame = cell.textLabel.frame;
aFrame.size.width = 100; // for example
cell.textLabel.frame = aFrame;
Cree un UITableViewCell personalizado con una UILabel en él que pueda controlar como quiera, o trunca el texto que asigna a la clase de base textLabel para que se ajuste al espacio que tiene.
No es perfecto, pero he usado la técnica de truncamiento de texto en lugares donde una celda personalizada es excesiva (por ejemplo, cuando el único problema era ajustar el texto) usando una categoría NSString con un método similar al siguiente:
- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font
{
NSString *result = [NSString stringWithString:self];
while ([result sizeWithFont:font].width > width)
{
result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];
result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
}
return result;
}
Probablemente no esté ''optimizado'' pero funciona para escenarios simples.
He luchado con esto un montón y he encontrado una respuesta bastante simple. Mi textLabel
estaba a la izquierda y empujaba el detailText
de detailText
a la derecha hasta el punto de que no se podía ver a veces.
Mi solución, cambie el style
Table View Cell
a Subtitle
desde Left Detail
o Right Detail
. Esta solución funciona si no le importa que su texto de detailText
esté debajo, en lugar de a la derecha o la izquierda.
Si tiene problemas con el alto de la fila, puede ajustar eso usando el código que se encuentra a continuación en viewDidLoad
.
self.tableView.estimatedRowHeight = 500 // set this as high as you might need, although I haven''t tested alternatives
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.reloadData()
Lo más simple para mí fue la subclase UITableViewCell y anular las vistas de diseño.
No se pudo encontrar una forma confiable para calcular las posiciones desde solo los marcos de las etiquetas, por lo que simplemente codificó el ancho del accesorio para en este caso una celda UITableViewCellStyleValue1 con un tipo de accesorio UITableViewCellAccessoryDisclosureIndicator.
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat detailTextLabelWidth = [self.detailTextLabel.text sizeWithFont:self.detailTextLabel.font].width;
CGRect detailTextLabelFrame = self.detailTextLabel.frame;
if (detailTextLabelFrame.size.width <= detailTextLabelWidth && detailTextLabelWidth > 0) {
detailTextLabelFrame.size.width = detailTextLabelWidth;
CGFloat accessoryWidth = (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) ? 28.0f : 35.0f;
detailTextLabelFrame.origin.x = self.frame.size.width - accessoryWidth - detailTextLabelWidth;
self.detailTextLabel.frame = detailTextLabelFrame;
CGRect textLabelFrame = self.textLabel.frame;
textLabelFrame.size.width = detailTextLabelFrame.origin.x - textLabelFrame.origin.x;
self.textLabel.frame = textLabelFrame;
}
}
Me encontré con un problema similar cuando intenté usar "Detalles correctos" en UITableView; la etiqueta de título incorporada del detalle correcto estaba golpeando mi etiqueta de subtítulo.
Finalmente, abandoné el "Detalle correcto" en favor de mi propio personalizado (usando swift y autolayout):
Creé mi propia clase simple que heredé de la UITableViewCell:
class TransactionCell: UITableViewCell { }
Configuré mi celda prototipo para usar esa clase personalizada configurando el campo "Estilo" en "Personalizado" en el menú "Celda de vista de tabla" y agregando "TransactionCell" al campo "Clase" del menú "Clase personalizada". Estos menús están disponibles cuando selecciona la celda prototipo en el guión gráfico.
Agregué dos etiquetas a mi celda prototipo y las conecté a mi clase personalizada arrastrando con el botón derecho desde mis etiquetas a mi clase (Curiosamente, tuve que limpiar mi compilación antes de que me permitiera hacerlo):
class TransactionCell: UITableViewCell{ @IBOutlet weak var detailsLabel: UILabel! @IBOutlet weak var amountLabel: UILabel! }
Agregué nuevas restricciones a mis etiquetas, aprovechando las características de autolayout de swift (tendrá que configurarlas para que se ajusten a sus propios requisitos; consulte un tutorial sobre autolayout si está atascado)
- ... y configure los campos "Líneas" y "Saltos de línea" en los respectivos menús de "Etiqueta" para que el espacio entre las etiquetas sea uniforme y para que la etiqueta de mis detalles pueda doblarse a varias líneas.
Funcionó para mí, permitiéndome tener la flexibilidad de diferentes cantidades de múltiples líneas en un UITableView en celdas rápidas, mientras formateo el ajuste de la palabra para que se viera bien e incluso, como si hubiera esperado que hiciera el "Detalle correcto" automáticamente.
Respuesta actualizada de Gosoftworks Development.
Swift 3
class BaseTableViewCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
guard let tl = textLabel, let dl = detailTextLabel else { return }
if (tl.frame.maxX > dl.frame.minX) {
tl.frame.size.width = dl.frame.minX - tl.frame.minX - 5
}
}
}
Tuve el mismo problema y tuve que crear una subclase UITableViewCell . Es más fácil hacer eso de lo que pensaba:
Básicamente, solo crea un archivo nuevo, que es una subclase de UITableViewCell
Añadir las etiquetas y sintetizarlas:
// in the .h file
@property (nonatomic, weak) IBOutlet UILabel *textLabel;
@property (nonatomic, weak) IBOutlet UILabel *detailTextLabel;
// in the .m file
@synthesize textLabel, detailTextLabel;
En StoryBoard, establezca su clase como la clase de celda, haga que el estilo sea "Personalizado" y agregue dos etiquetas en la celda para que se vean exactamente como usted quiere (las hice parecidas a las predeterminadas: http://cl.ly/J7z3 )
La parte más importante es asegurarse de conectar las etiquetas a la celda
Debe hacer clic con la tecla Control presionada desde la celda hasta la etiqueta en el perfil del documento. Aquí hay una foto de cómo se ve: http://cl.ly/J7BP
Lo que me ayudó a entender cómo crear celdas personalizadas, dinámicas y estáticas es este video de youtube: http://www.youtube.com/watch?v=fnzkcV_XUw8
Una vez que hagas eso, deberías estar listo. ¡Buena suerte!
Use la propiedad lineBreakMode de lineBreakMode
para restringir su texto dentro del ancho de su UILabel
@property(nonatomic) UILineBreakMode lineBreakMode
Úsalo como abajo.
myLabel.lineBreakMode = UILineBreakModeTailTruncation;
Aquí está la lista de valores que podrían usarse con lineBreakMode
.
EDITADO:
Establezca el ancho de su UILabel
según su UILabel
p.ej.
myLabel.frame.size.width = 320;