如何在调用-drawRect后在UIView中绘制文本

时间:2013-02-15 21:43:06

标签: objective-c cgcontext

我有一个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];
}  

4 个答案:

答案 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子视图,这会带来新的问题。

感谢大家的意见。