RubyMotionを使用しており、 CKCalendarViewを使用してカレンダーを実装しています。次のコードで、イベントが発生する日を強調表示しています。
次のメソッドはから呼び出されますlayoutSubviews
def calendarDidLayoutSubviews(calendar)
_events_array = []
if self.events
self.events.reverse.each do |ev|
mdy = ev.date.month_date_year
_events_array << mdy unless _events_array.include?(mdy)
end
end
Dispatch::Queue.main.async do
today = NSDate.date.month_date_year
if calendar.dateButtons && calendar.dateButtons.length > 0
calendar.dateButtons.each do |db|
db.backgroundColor = "f4f2ee".to_color
if db.date && db.date >= calendar.minimumDate && db.date <= calendar.maximumDate
if _events_array && _events_array.length > 0
db.setTitleColor("c7c3bb".to_color, forState:UIControlStateNormal)
db.backgroundColor = "f4f2ee".to_color
if _events_array.include?(db.date.month_date_year)
db.setTitleColor(UIColor.blackColor, forState:UIControlStateNormal)
db.backgroundColor = "9ebf6c".to_color
_events_array.delete(db.date.month_date_year)
end
end
end
if db.date && db.date.month_date_year == today
if calendar.minimumDate <= db.date && calendar.maximumDate >= db.date
db.setTitleColor(UIColor.blackColor, forState:UIControlStateNormal)
else
db.setTitleColor("f4f2ee".to_color, forState:UIControlStateNormal)
end
end
end
end
end
end
現状では、これにより、描画時にUIが0.5〜1.5秒間フリーズします。バックグラウンドスレッドに移動すると、描画に4〜5倍の時間がかかりますが、UIがフリーズしません。
質問:背景スレッドに高い優先度を与える方法、または描画にかかる半ダース秒で何も起こっていないように見えないように、dateButtonsを段階的に描画して強調表示する方法はありますか?メインスレッド)?