2009-08-11 6 views
0

Je suis conscient qu'il existe plusieurs implémentations de calendrier Cocoa Touch/iPhone disponibles en ligne, mais pour certaines raisons, j'essaie de créer le mien. Je rencontre un problème où le code que j'utilise pour mettre en page les dates (que je représente comme des instances de UIView placées en sous-vues dans un autre UIView) est en train de gâcher en décembre.Cocoa Touch: Disposer des dates dans un calendrier mensuel

Actuellement, ce que je fais est la date en décompose une instance de NSDateComponents, puis obtenir les week et weekday propriétés des composants pour déterminer les X et Y « positions » de la vue de la date, respectivement. Je peux compenser la position X par la propriété week pour le premier jour du mois que je prépare.

Exemple bref: le premier jour d'août 2009 tombe un samedi et la propriété week de ses composants de date est 31 (en utilisant un calendrier grégorien). Donc sa position Y est 6 et sa position X est 0, et le décalage X que j'utiliserai est 31. Donc je peux prendre le deuxième jour d'août, qui est un dimanche, et déterminer que sa position X est 0 et son La position Y est week - 31 = 32 - 31 = 1. De cette façon, je peux mettre en place une grille indexée de date zéro pour le mois d'août, et tout va bien ...

... jusqu'à ce que je essayer de faire la même chose pour décembre. En Décembre 2009, apparemment la propriété week se termine à 1 le 27 (un dimanche), ce qui signifie que je finis par essayer de placer le 27 au 31 à Y positions -48 ou plus.

Ma question est double: pourquoi la propriété week est-elle à mi-chemin du dernier mois de l'année? Est-ce indexé le dernier dimanche de l'année précédente plutôt que le premier jour de l'année? Et deuxièmement, existe-t-il une meilleure façon de disposer une grille de dates comme celle-ci (en utilisant d'autres composants d'une instance NSDateComponents, ou tout ce que je peux obtenir d'un NSDate et d'un NSCalendar) ou dois-je simplement ajouter Condition "dernière semaine de l'année"?

Répondre

2

Les derniers jours de décembre commencent à appartenir à la semaine 1 de l'année suivante. (Voir here)

Au lieu d'utiliser la propriété de la semaine pour calculer les positions en semaine, je venais de commencer par Y = 0 puis l'augmenter après chaque samedi (si votre semaine commence le dimanche)

int x = <calculate x based on the weekday of the 1st of the month> 
int y = 0 
for (days in month) { 
    <add subview for this day> 
    x += xOffset 
    if (currentWeekday == saturday) { 
     x = 0 
     y += yOffset 
    } 
} 

PS: je chercherais probablement à la configuration locale pour déterminer le premier jour de la semaine:

NSLocale *locale = [NSLocale currentLocale]; 
NSCalendar *calendar = [locale objectForKey:NSLocaleCalendar]; 
NSUInteger firstWeekday = [calendar firstWeekday]; 
1

je ne serais probablement pas utiliser semaines dans mon calcul. Vous devez disposer les jours en rangées de 7, que nous connaissons bien évidemment sous forme de semaines. Pratiquement, vous devriez pouvoir vous en sortir en sachant juste le jour de l'année et en faisant un module.

Dites que l'année commence le dimanche (colonne 1) et vous voulez connaître la position du 100ème jour. Eh bien 100/7 = 14 avec un reste. Donc c'est dans la 14ème rangée. Ensuite, faites un mod 100% 7 = 2. Donc ça tombe un lundi (dans mon exemple).

+0

Mais est-ce localisable? Je veux être aussi générique dans mes calculs que possible, dans l'éventualité où je n'aurais jamais besoin d'utiliser ce code dans un contexte non-grégorien. – Tim

+0

Je pense que Gregorian est une bonne base pour calculer le reste de vos localisations. Je ne peux pas penser à une façon plus générale que de représenter une année comme 365 jours. La manière dont vous présentez les données est complètement distincte de votre implémentation sous-jacente. Vous pouvez créer une nouvelle catégorie pour gérer les traductions de ce système vers le format dont vous avez besoin. –

Questions connexes