Cocoa Touch:在月视图日历上列出日期

时间:2009-08-11 04:37:39

标签: iphone cocoa-touch layout calendar

我知道网上有几个Cocoa Touch / iPhone日历实现,但出于某些原因我正在尝试创建自己的。我遇到了一个问题,我用来布置日期的代码(我将其表示为UIView作为子视图放入另一个UIView的实例)在12月份搞乱了。

目前,我所做的是将日期分解为NSDateComponents的实例,然后获取组件的weekweekday属性以找出日期视图的X和Y“位置” , 分别。我可以在我正在布置的那个月的第一天用week属性来抵消X位置。

简要示例:2009年8月的第一天是星期六,其日期组件“week属性为31(使用公历)。因此它的Y位置是6,它的X位置是0,我将使用的X偏移是31.所以我可以采取8月的第二天,也就是星期日,并确定它的X位置为0并且Y位置是week - 31 = 32 - 31 = 1.这样我可以为8月份布置一个零索引的日期视图网格,这一切都顺其自然......

......直到我试图在12月份做同样的事情。在2009年12月,显然week属性在27日(星期日)结束为1,这意味着我最终试图将第27位到第31位置于Y位置-48左右。

我的问题有两个:为什么week财产会在一年中的最后一个月中途进行?它是否在上一年的最后一个星期日而不是一年的第一天编入索引?第二,是否有更好的方法来布局这样的日期网格(使用NSDateComponents实例中的其他组件,或者我可以从NSDate和NSCalendar获得的任何其他组件),或者我只需添加一个检查“一年中最后一周”的情况?

2 个答案:

答案 0 :(得分:2)

12月的最后几天开始属于明年的第1周。 (见here

我没有使用周属性来计算工作日的位置,而是从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 :(得分:1)

我可能不会在计算中使用数周。你需要以7行的顺序列出这些日子,当然我们在概念上知道它们是几周。实际上,你应该只知道一年中的某一天并做模数就能逃脱。

假设年份从星期日开始(第1列),你想知道第100天的位置。好100/7 = 14剩余。所以它在第14排。然后做一个mod 100%7 = 2.所以它落在星期一(在我的例子中)。