我有一个iPad应用程序,XCode 4.5,iOS 6.1和Storyboard。我有一个UIView,其中嵌入了两(2)个UIViews。第一个UIView(称为Calendar)位于上半部分,第二个UIView(称为Schedule)位于下半部分。我在上半部分创建了一个日历,并绘制了一个网格以显示下半部分的时间表。
事件序列是向用户呈现带有日历的场景(完全填写当月)和计划(显示空网格)。在日历上点击一天时,该日程安排将显示在“日程安排”视图中。
问题是在最初显示场景时调用-drawRect
,然后用户才能选择要为日程安排显示的日期。由于我必须从-drawRect中进行绘图,我无法弄清楚如何填写-drawRect
之外的时间表。我想知道是否使用 setNeedsDisplayInRect:,可以完成我需要做的事情吗?
我已经看了几天SO和谷歌,但没有找到能回答这个特定问题的内容。这不是this question的副本,而是一个后续项目,因为项目已经重新定义。任何想法都将不胜感激。
UPDATE:这是我使用setNeedsDisplayInRect的代码:
- (void) drawSchedule {
const float rectWidth = 120.0;
// draw detail for selected day for each staff member
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetLineWidth(context, 1.0);
CGContextSetRGBFillColor(context, 0, 0, 1, 0.3);
UIGraphicsBeginImageContext(self.bounds.size);
// draw customer name using bounds from CGRectMake
const float nameFontSize = 12;
UIFont *hourfont=[UIFont systemFontOfSize: nameFontSize];
[[UIColor blackColor] set];
[self setNeedsDisplayInRect: CGRectMake(160.0, 150.0, 120.0, 50.0)]; // mark as needs to be redrawn
// customer for this time slot
[@"John Doe" drawAtPoint:CGPointMake(114, 40) withFont:hourfont];
}
答案 0 :(得分:5)
在日历上点击一天时,该日程安排将显示在日程安排视图中。
当您用户点击日历上的一天时,请告知计划更改:
[self.calendarView displayDate: thatDay];
反过来,附表得到消息,弄清楚它需要做什么,并告诉自己在绘制时间时重新显示。
- (void) displayDate: (YourDateObject*) thatDay
{
self.date=thatDay;
[self setNeedsDisplay: YES]
}
现在,系统会在适当的时间调用时间表drawRect:
,然后您将显示新的时间表。
一般规则就是这样:在您知道视图时设置视图的状态,并在询问时让视图重新显示。不要试图说“画这个”;相反,说,“这是你下次应该画的。一旦你准备好了,举手;老师会拜访你。”
答案 1 :(得分:0)
也许您可以使用UIView的方法: setNeedsDisplay 。这将导致drawRect:再次被调用。或者,如果您只想重绘视图的一部分,可以使用 setNeedsDisplayInRect :,如您所述。 你永远不应该打电话给drawRect:你自己。
UIGraphicsBeginImageContext(self.bounds.size)
[@"John Doe" drawAtPoint:CGPointMake(114,40) withFont:hourFont];
UIimage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
然后,您可以使用 imageView 将其添加为视图的子视图。
答案 2 :(得分:0)
通常,您应该在drawRect:
方法中完成所有绘图。当用户点击日历中的日期时,您只需将setNeedsUpdate
消息发送到日程视图。然后,计划视图将自动重绘并调用自己的drawRect:
方法。
调用setNeedsDisplayInRect:
(或setNeedsDisplay
)只是通知系统需要重绘接收器。当适合执行实际绘图时,稍后会调用drawRect:
方法。
答案 3 :(得分:0)
这个问题没有实际意义;你无法清除UIView上的绘图,这使得这种设计不可行。
我现在正在考虑在日程表网格上使用UITableViews或UIView子视图,这会带来新的问题。
感谢大家的意见。