Cocoa Touch:在月视图日历上布置日期
Posted
技术标签:
【中文标题】Cocoa Touch:在月视图日历上布置日期【英文标题】:Cocoa Touch: Laying out dates on a month-view calendar 【发布时间】:2009-08-11 04:37:38 【问题描述】:我知道网上有几种 Cocoa Touch/iPhone 日历实现,但出于某些原因,我正在尝试创建自己的。我遇到了一个问题,我用来布置日期的代码(我将其表示为作为子视图放置到另一个 UIView 中的 UIView 的实例)在 12 月搞砸了。
目前,我所做的是将日期分解为 NSDateComponents 的实例,然后获取组件的 week
和 weekday
属性以分别找出日期视图的 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 获得的任何其他组件),或者我只需要添加一个检查“一年中的最后一周”条件?
【问题讨论】:
【参考方案1】:12 月的最后几天开始属于下一年的第 1 周。 (见here)
我不使用 week 属性来计算工作日位置,而是从 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];
【讨论】:
【参考方案2】:我可能不会在计算中使用周数。您需要以 7 行为单位排列天数,当然我们在概念上将其称为周数。实际上,只要知道一年中的哪一天并进行模数运算,您就应该能够摆脱困境。
假设年份从星期日开始(第 1 列),您想知道第 100 天的位置。 100 / 7 = 14 有余数。所以它在第14行。然后做一个 mod 100 % 7 = 2。所以它落在星期一(在我的例子中)。
【讨论】:
但这可以本地化吗?我希望在我的计算中尽可能通用,如果我需要在非公历设置中使用此代码。 我认为 gregorian 是一个很好的基础来计算您的其余本地化。我想不出比将一年表示为 365 天更通用的方法了。您如何呈现数据与您的底层实现完全分开。您可以创建一个新类别来处理从该系统到您可能需要的任何格式的翻译。以上是关于Cocoa Touch:在月视图日历上布置日期的主要内容,如果未能解决你的问题,请参考以下文章
如何使用不同日期自定义周末日期,并在完整日历中使用不同的小时数
Swift FSCalendar 在表格视图的日历显示事件中选择日期