2016-12-14 4 views
0

J'ai un UITableView, dans lequel chaque ligne affiche une date et une heure plus un message (capture d'écran ci-dessous). J'utilise une seule chaîne attribuée pour afficher le texte dans la ligne (ce qui est nécessaire pour la différence de couleur). Comme je ne veux pas mettre à zéro le mois, le jour ou l'heure, la date sur le côté gauche des deux points est de longueur variable, ce qui provoque une désorganisation de la liste des messages.Formatage d'une date à largeur fixe sans remplissage nul

Le résultat que je souhaite est que tous les deux-points soient alignés verticalement, de sorte que les messages s'alignent, malgré le nombre de caractères dans la date étant variable. Quelle est la meilleure façon d'accomplir cela? J'ai essayé essentiellement le remplissage de l'espace (en détectant la longueur du mois, du jour et de l'heure), mais le résultat ne s'aligne toujours pas parfaitement et peut donner lieu à de longs blocs (d'apparence moche) quand tous les trois (mois, date et heure) doivent être complétés. Peut-être existe-t-il un moyen de répartir cet espace supplémentaire entre tous les personnages de manière égale?

Date de mise en forme:

//choose format for the date 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "M/d h:mma: " 
dateFormatter.amSymbol = "am" 
dateFormatter.pmSymbol = "pm" 

Entrer dans la vue:

//first put in the date 
let classHistoryCellText = NSMutableAttributedString.init(string: formattedDate) 
classHistoryCellText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(hex: "#00000", alpha: 0.3), range: NSMakeRange(0, lengthOfDate)) 

//append what the message is 
classHistoryCellText.append(NSMutableAttributedString.init(string: classBeingViewed.classHistory[indexPath.row]["event"] as! String)) 
classHistoryCellText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(hex: "#00000"), range: NSMakeRange(lengthOfDate, classHistoryCellText.length - lengthOfDate)) 

//bold the entire thing and make it size fontSize 
classHistoryCellText.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: fontSize), range: NSMakeRange(0, classHistoryCellText.length)) 

classHistoryCellToDisplay.textLabel?.attributedText = classHistoryCellText 

Résultat:

enter image description here

+0

Prendre 2 étiquettes, sera plus facile. –

+0

Je vous suggère fortement d'utiliser AAAA-MM-JJ pour la date (oui, rempli de zéro). C'est la norme ISO, et si votre application a des utilisateurs internationaux, ils l'apprécieront. Vous avez deux autres options que vous voudrez peut-être envisager ... une police de longueur fixe alignera tout si vous remplissez zéro. Deuxièmement, placez la date et l'heure sur sa propre ligne. Ajoutez le commentaire sur la ligne suivante en dessous. – Tony

Répondre

0

Essayez de changer formatter date:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM/dd hh:mma: " // this line is changed 
dateFormatter.amSymbol = "am" 
dateFormatter.pmSymbol = "pm" 

Il fera des mois, des jours et des heures pour toujours avoir deux chiffres qui rendront toutes vos dates de la même largeur.

Cela fonctionne à moins que vous ayez une exigence spécifique pour éviter d'afficher des zéros en tête. Si c'est le cas, la solution la plus simple consiste à utiliser deux étiquettes: une pour la date et une pour le statut. Rendez l'étiquette de date une largeur fixe.

+0

Merci, mais "je ne veux pas mettre à zéro le mois, le jour ou l'heure". – monstermac77

+0

Vérifiez la réponse mise à jour. La solution la plus simple consiste à utiliser deux étiquettes de largeur fixe (en utilisant des contraintes) pour l'étiquette de date. – JPetric

+0

L'une des raisons pour lesquelles j'essayais d'éviter d'utiliser deux étiquettes était parce que j'ai besoin que le texte du message soit capable d'envelopper s'il s'étend au-delà des limites de l'écran. Cela nécessitait de surcharger la fonction 'heightForRowAt' de ma table, ce qui était un peu compliqué, car cela impliquait de calculer la hauteur estimée du texte en utilisant' boundingRect'. Je pense que la décomposer en deux étiquettes rendra le calcul de l'estimation de la taille plus difficile, mais peut-être que ce n'est pas le cas? – monstermac77