Cocoa Touch: размещение дат в календаре на месяц - PullRequest
0 голосов
/ 11 августа 2009

Мне известно, что в Интернете есть несколько реализаций календаря Cocoa Touch / iPhone, но по определенным причинам я пытаюсь создать свою собственную. Я сталкиваюсь с проблемой, из-за которой код, который я использую для разметки дат (который я представляю как экземпляры UIView, помещенные в виде подвидов в другой UIView), не работает в декабре.

В настоящее время я разбиваю дату на экземпляр NSDateComponents, затем получаю свойства week и weekday компонентов, чтобы определить X и Y "позиции" представления даты соответственно. Я могу сместить позицию X с помощью свойства week для первого дня месяца, который я выкладываю.

Краткий пример: первый день августа 2009 года приходится на субботу, а свойство week его компонентов даты равно 31 (с использованием григорианского календаря). Поэтому его позиция Y равна 6, а позиция X равна 0, а смещение X, которое я буду использовать, равно 31. Поэтому я могу взять второй день августа, который является воскресеньем, и определить, что его позиция X равна 0, а его Позиция Y - week - 31 = 32 - 31 = 1. Таким образом, я могу выложить нулевую индексированную сетку представлений даты за август, и все идет гладко ...

... пока я не попытаюсь сделать то же самое для декабря. В декабре 2009 года, по-видимому, свойство week становится равным 1 27-го (воскресенье), что означает, что я пытаюсь расположить 27-е по 31-е в позициях Y -48 или около того.

У меня двоякий вопрос: почему свойство week частично входит в последний месяц года? Индексируется ли это в последнее воскресенье предыдущего года, а не в первый день года? И, во-вторых, есть ли лучший способ выложить сетку дат, подобную этой (используя другие компоненты из экземпляра NSDateComponents или что-либо еще, что я могу получить из NSDate и NSCalendar), или мне просто нужно добавить проверку для условие "последняя неделя года"?

Ответы [ 2 ]

2 голосов
/ 11 августа 2009

Последние несколько дней декабря начинают относиться к первой неделе следующего года. (см. здесь )

Вместо использования свойства недели для вычисления позиций дня недели, я бы просто начал с Y = 0, а затем увеличивал его после каждой субботы (если ваша неделя начинается в воскресенье)

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
    }
}

P.S .: Возможно, я посмотрю на текущую локаль, чтобы определить первый день недели:

NSLocale *locale = [NSLocale currentLocale];
NSCalendar *calendar = [locale objectForKey:NSLocaleCalendar];
NSUInteger firstWeekday = [calendar firstWeekday];
1 голос
/ 11 августа 2009

Я, вероятно, не использовал бы недели в моих вычислениях. Вам нужно расположить дни в строках по 7, которые, конечно, мы концептуально знаем как недели. Практически вы должны уйти, просто зная день года и выполняя модуль.

Скажем, год начинается в воскресенье (столбец 1), и вы хотите знать положение сотого дня. Скважина 100/7 = 14 с остатком. Так же и в 14-м ряду. Затем сделайте мод 100% 7 = 2. Таким образом, он выпадает на понедельник (в моем примере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...