2009-08-11 65 views
0

我知道有幾個Cocoa Touch/iPhone日曆實現可以在線使用,但由於某些原因,我試圖創建自己的日曆。我遇到了一個問題,我使用的代碼將日期(我將UIView的實例表示爲子視圖的實例放置到另一個UIView中)代碼在12月搞亂了。Cocoa Touch:在月視圖日曆上佈置日期

目前,我做的是分解日起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月份的日期視圖制定一個零索引的網格,並且它一切順利...

...直到我試着在十二月份做同樣的事情。 2009年12月,27日(星期日)顯然week財產包攬到1,這意味着我打算將第27到第31位置於Y位置-48左右。

我的問題是雙重的:爲什麼week財產中途進入一年的最後一個月?它是在上一年的最後一個星期日而不是一年中的第一天進行索引的?第二,有沒有更好的方式來鋪陳日期格這樣的(使用其他組件從NSDateComponents實例,或者別的什麼我可以從一個NSDate和NSCalendar獲得),或者我只需要添加一個檢查的「一年的最後一週」的條件?

回答

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

PS:我可能會看當前語言環境來確定第一個週日:

NSLocale *locale = [NSLocale currentLocale]; 
NSCalendar *calendar = [locale objectForKey:NSLocaleCalendar]; 
NSUInteger firstWeekday = [calendar firstWeekday]; 
1

我可能不會在我的計算中使用數週。你需要將這些日子排成7排,這當然我們在概念上已經知道爲幾周。實際上,只要知道一年中的某一天並做一個模數,你就應該能夠脫身。

說年度從星期天開始(第1列),你想知道第100天的位置。井100/7 = 14與餘數。所以它在第14排。然後做一個mod 100%7 = 2.所以它落在星期一(在我的例子中)。

+0

但是這是可本地化的嗎?我希望儘可能在我的計算中儘可能通用,因爲我不想在非公曆環境中使用此代碼。 – Tim 2009-08-11 17:30:43

+0

我認爲格里高利是一個很好的基礎來計算您的本地化的休息。我想不出比一年365天更全面的方式。您如何呈現數據與您的基礎實施完全分開。您可以創建一個新類別來處理從該系統到您可能需要的任何格式的翻譯。 – 2009-08-12 07:56:06