Aplicación Calendario

4 views
Skip to first unread message

Jordi Rallo

unread,
Dec 13, 2010, 5:20:24 AM12/13/10
to ios-spa
Hola,

después de tres semanas de hacer el curso en Barcelona, nos hemos
decidido a desarrollar una pequeña aplicación para probar todo el
mecanismo de registrarnos en apple como desarrolladores y subir la
aplicación a AppStore.

La idea es realizar un típico calendario anual con una foto por cada
mes.

El problema es que después de tres semanas de realizar el curso, no se
por donde empezar.

Había pensado en realizar 12 vistas, una por mes, donde aparecerían
una foto y el calendario del mes determinado.
Para el tema del calendario hay algún tipo de objeto que te dibuje el
calendario para un mes/año determinado?

A ver si me podéis guiar un poco más.

Os voy explicando la experiencia.

Gracias por todo.

Saludos

Jesús Mazcuñán

unread,
Dec 13, 2010, 9:00:27 AM12/13/10
to ios...@googlegroups.com
Lo más fácil sería hacer 12 imágenes, una por cada mes (con el calendario incluido) y meter un UIImageView que cambiara al seleccionar el mes. Para seleccionar el mes... pondría que el UIImageView es un UIControl y le haría que pudise recibir taps. Gestionando el click y comprobando si el tap tiene un valor de X mayor o menor que 160, cambiaría al anterior o al siguiente.

Si tengo un rato os hago un ejemplo. :D

Otra opción sería crear el control con labels y demás. No debe ser muy complicado, requiere algo de matemáticas para la localización de los días (Que seguro que se pueden obtener como número del 1 al 7 para el día de la semana y como número de semana del año... Eso y un UIImageView que cambie según el mes. Y dos botones para cambiar de mes.

Si tengo otro rato os hago en ejemplo. :D

Luego tengo tiempo en casa. A ver si puedo. :D

Jesús Mazcuñán

unread,
Dec 14, 2010, 6:30:54 PM12/14/10
to ios...@googlegroups.com
Tengo un cacho de código que te puede ser útil pero no tengo forma de
pasarela rápidamente por correo (noche sin tethering... me gustaría
saber porqué me pasa esto de vez en cuando...)

El caso es que lo que he hecho es crearme unas variables que definen:
- ancho de la casilla de día
- alto de la casilla de día
- número de día de la semana en el que hay que empezar (0 para el
lunes, ..., 6 para el viernes)
- número de la semana en la que hay que empezar (de 0 a 4, porque 31
días pueden extenderse como mucho en 5 semanas)
- número de días que tiene el mes.

Con eso, hago un for que genera UILabels posicionadas mientras le
quedan días al mes (matemáticas...).

La parte "curiosa" de la personalización del label sería (parto de
UILabel * label):

label.backgroundColor = [UIColor white];
label.text = [NSString stringWithForma;@"%d", i]; // La i del for...
que va de 1 a la duración del mes...
label.textAlignment = UITextAlignmentCenter;

// Necesitas haber hecho #import <QuartzCore/QuartzCore.h>
label.layer.borderColor = [UIColor grayColor].CGColor;
label.layer.borderWith = 1.0;

Cada bucle hace un [self.view addSubview: label] y un [label release]

Con eso puedes comenzar a posicionar los Labels donde tocan. Falta la
parte del código que te calcula los aspectos temporales.
Necesitaremos:
- El día en el que estás
- El mes en el que estás
- Los días que tiene el mes
- Si el mes empieza en Lunes, martes, etc...

Si es un calendario fijo, puedes fijar esos parámetros para cada
vista. Si no, toca calcular. Me huele que es con NSDate pero no tengo
ahora mismo fresquitos los métodos exáctos. A ver si lo puedo revisar.
:D

--
"Tengo artículos prohibidos de lugares
en los que el hombre no osa aventurarse.
También tengo yogur helado,
al que llamo Yogurlado."

http://www.mazcunan.net/

Jesús Mazcuñán

unread,
Dec 15, 2010, 3:30:33 AM12/15/10
to ios...@googlegroups.com
Ya he solucionado el problema del tethering... no me lo puedo creer. He leido que la culpa es del Dropbox, lo de desactivado y todo ha vuelto a funcionar.

Lo que decía anoche es esto:

- (void)viewDidLoad {

weekHeight = 42;

dayWidth = 42;

monthAreaOrigin = CGPointMake((320-dayWidth*7)/2, 60);

UILabel * temp;

int weekDay = 0; // 0 to 6

int monthWeek = 0; // 0 to 4

int monthDays = 31;

for (int i = 1; i<=monthDays; i++) {

temp = [[UILabel alloc] initWithFrame:CGRectMake(monthAreaOrigin.x + dayWidth * weekDay, monthAreaOrigin.y + monthWeek * weekHeight, dayWidth, weekHeight)];

[temp setBackgroundColor:[UIColor whiteColor]];

[temp setText:[NSString stringWithFormat:@"%d", i]];

[temp setTextAlignment:UITextAlignmentCenter];

// Esta parte requiere un #import <QuartzCore/QuartzCore.h>

temp.layer.borderColor = [UIColor grayColor].CGColor;

temp.layer.borderWidth = 1.0;


[self.view addSubview:temp];

[temp release];

weekDay++;

if (weekDay > 6)

{

weekDay = 0;

monthWeek++;

}

}

    [super viewDidLoad];

}



Y las variables de instancia que inicializo al principio son dos int y un CGPoint que he declarado en el .h

Jesús Mazcuñán

unread,
Dec 15, 2010, 4:57:07 PM12/15/10
to ios...@googlegroups.com
Como nota adicional, el tema de gestionar las fechas con NSDate, NSDateComponent y NSCalendar...

Un cacho de código... (abajo lo explico)

NSDate *currentDate = [NSDate date];

NSLog(@"%@", currentDate);

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

[calendar setFirstWeekday:1];

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit;

NSDateComponents *currentDayComponents = [calendar components:unitFlags fromDate:currentDate];

NSLog(@"%d/%d/%d (%d/%d)",[currentDayComponents day],[currentDayComponents month],[currentDayComponents year],[currentDayComponents weekday],[currentDayComponents weekdayOrdinal]);

NSDateComponents *modifier = [[NSDateComponents alloc] init];

[modifier setDay:-[currentDayComponents day]+1];

NSDate *firstDayOfCurrentMonth = [calendar dateByAddingComponents:modifier toDate:currentDate options:0];

NSDateComponents * firstDayOfCurrentMonthComponents = [calendar components:unitFlags fromDate:firstDayOfCurrentMonth];

NSLog(@"%d/%d/%d (%d/%d)",[firstDayOfCurrentMonthComponents day],[firstDayOfCurrentMonthComponents month],[firstDayOfCurrentMonthComponents year],[firstDayOfCurrentMonthComponents weekday],[firstDayOfCurrentMonthComponents weekdayOrdinal]);


NSDate almacena una fecha.
NSCalendar permite inicializarse a partir de una fecha.
NSDateComponents permite obtener los componentes de una fecha de manera separada (en plan key-value)
NSDateComponents también nos permite hacer un bloque de tiempo por componentes que podemos utilizar a posteriori para obtener una fecha a partir de otra (en el ejemplo le resto los días a los días del mes para obtener el primer día del mes).

Algunas cosillas...
- Los días tienen un valor numérico (weekday) de forma que en el gregoriano el domingo es el 1 y van subiendo.
- El weekdayOrdinal es el número de semana dentro del mes
- El día 0 de un mes es el último día del mes anterior.

Un saludo.
Reply all
Reply to author
Forward
0 new messages