2

我有一个 iPad 应用程序、XCode 4.5、iOS 6.1 和 Storyboards。我有一个 UIView,其中嵌入了两 (2) 个 UIView。第一个 UIView(称为 Calendar)在上半部分,第二个 UIView(称为 Schedule)在下半部分。我在上半部分创建了一个日历,并在下半部分绘制了一个网格以显示日程安排。

事件的顺序是向用户呈现带有日历(当前月份完全填写)和时间表(显示一个空网格)的场景。在日历上点击某一天时,该天的日程安排将显示在日程安排视图中。

该问题-drawRect在最初显示场景时被调用,在用户能够选择要显示日程的日期之前。由于我必须从 -drawRect 内部进行绘图,因此我无法弄清楚如何在-drawRect. 我想知道使用setNeedsDisplayInRect:是否会完成我需要做的事情?

我已经查看了 SO 和 Google 好几天了,但没有发现任何可以回答这个特定问题的东西。这不是这个问题的重复,而是一个后续项目,因为该项目已被重新定义。任何想法将不胜感激。

更新:这是我使用 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

4 回答 4

5

在日历上点击某一天时,该天的日程安排将显示在日程安排视图中。

当您用户点击日历上的某一天时,告诉 Schedule 进行更改:

  [self.calendarView displayDate: thatDay];

反过来,Schedule 会收到消息,弄清楚它需要做什么,并告诉自己在绘制时间时重新显示。

 - (void) displayDate: (YourDateObject*) thatDay
 {
      self.date=thatDay;
      [self setNeedsDisplay: YES]
  }

现在,系统将drawRect:在适当的时间调用日程表,您将显示新的日程表。

一般规则很简单:当你知道视图的状态时设置它,并在被询问时让视图重新显示自己。不要试图说“画这个”;而是说,“这是你下次应该画的。一旦你准备好了,举手;老师会叫你的。”

于 2013-02-23T04:39:06.863 回答
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将其作为子视图添加到您的视图中。

于 2013-02-15T22:07:11.217 回答
0

通常,您应该在该drawRect:方法中完成所有绘图。当用户点击日历中的日期时,您只需将setNeedsUpdate消息发送到日程视图。然后调度视图会自动重绘并调用自己的drawRect:方法。

调用setNeedsDisplayInRect:(or setNeedsDisplay) 只是通知系统需要重绘接收器。您的方法将在稍后drawRect:的某个时间点被调用,此时适合执行实际绘图。

于 2013-02-18T00:08:45.127 回答
0

这个问题没有实际意义;您无法清除 UIView 上的绘图,这使得这种设计不可行。

我现在正在考虑在计划网格顶部使用 UITableViews 或 UIView 子视图,这会带来新问题。

谢谢大家的意见。

于 2013-02-19T16:14:37.513 回答