Календарь для iPhone

В одном из своих проектов я столкнулся с тривиальной, на первый взгляд, задачей – работа с календарём. Но, начав разбираться, быстро пришел к выводу, что не все так просто. Главная проблема заключается в отсутствии календаря в стандартных библиотеках, предоставляемых платформой разработчику. Тогда я начал искать что-нибудь подходящее в готовых фрэймворках, но ничего, соответствующего моим задачам, я не нашел. В итоге оставался один выход – писать самому.
Потребовалось не так много времени, чтобы получить более или менее рабочий вариант. Изначально он выглядел достаточно убого, но, после добавления некоторого дизайна, всё изменилось:

Календарь для iPhone
Календарь для iPhone

Теперь хотелось бы остановиться на некоторых основных задачах, которые вызывали больше всего вопросов:
1.    Каким образом сделать вывод дней в месяце? Стоял выбор между использованием UILabel и UIButton. Выбор пал в пользу второго, ибо мне требовалось при нажатии на день выводить некоторую информацию. Таким образом, свойству Tag элемента UIButton мы может присваивать значение дня в месяце для дальнейшего использования.
2.    Каким образом вычислять день недели первого числа месяца для корректного расположения дней? Изначально я начал использовать класс NSDateFormatter, позволяющий получать названия дня из даты. На симуляторе все прекрасно работало, но после тестинга на девайсе(iPad) всё пришлось переделывать по причине того, что iPad достаточно своеобразно работает с датами. Честно говоря, вообще бы посоветовал как можно реже использовать NSDate и NSDateFormatter, гораздо проще написать свои простенькие парсеры.
Таким образом, я решил использовать алгоритм «вечного календаря», который позволяет получить день недели первого дня месяца :

- (NSInteger)getFirstDay: (NSInteger)day month: (NSInteger)month year:(NSInteger)year {
    NSInteger first;
    if(month<=2) {
            year = year - 1;
            day = day+3;
    }
    first = (day + year + year/4 - year/100 + year/400 + (31*month + 10)/12)%7;
    return first;
}

3.    Исходя из предыдущего пункта выплыл вопрос о том, как «распарсить» строку с датой. Это было сделать достаточно просто, ибо изначально я знал формат даты, получаемой мною с сервера. Ниже приведен код метода, принимающего строку с датой и возвращающего номер месяца:

- (NSInteger)getIntMonthFromDateString :( NSString *) s{
NSString *workMonth;
NSInteger intMonth;
workMonth = [s substringWithRange:NSMakeRange(5, 2)];
intMonth = [workMonth integerValue];
return intMonth;
}