2

iPad アプリ、XCode 4.5、iOS 6.1、ストーリーボードがあります。2 つの UIView が埋め込まれた UIView があります。最初の UIView (Calendar と呼ばれます) は上半分にあり、2 番目の UIView (Schedule と呼ばれます) は下半分にあります。上半分にカレンダーを作成し、下半分にグリッドを描画してスケジュールを表示します。

一連のイベントは、カレンダー (当月が完全に記入されている) とスケジュール (空のグリッドが表示されている) を含むシーンがユーザーに提示されることです。カレンダーで日付をタップすると、その日のスケジュールがスケジュールビューに表示されます。

この問題は-drawRect、ユーザーがスケジュールに表示する日付を選択できるようになる前に、シーンが最初に表示されたときに呼び出されます。-drawRect 内から描画を行う必要があるため、 の外でスケジュールを記入する方法がわかりません-drawRectsetNeedsDisplayInRect:を使用すると、必要なことを達成できるかどうか疑問に思っていましたか?

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

カレンダーで日をタップすると、その日のスケジュールがスケジュールビューに表示されます。

ユーザーがカレンダーの1日をタップしたら、スケジュールに変更を指示します。

  [self.calendarView displayDate: thatDay];

次に、スケジュールはメッセージを受け取り、何をする必要があるかを理解し、描画する時間になると再表示するように指示します。

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

これで、システムは適切な時間にスケジュールを呼び出し、drawRect:新しいスケジュールを表示します。

一般的なルールは単純です。ビューがわかっているときにビューの状態を設定し、要求されたときにビューが再表示されるようにします。「これを描いて」と言わないでください。代わりに、「次回はこれを描く必要があります。準備ができたらすぐに手を挙げてください。先生があなたを呼びます。」と言います。

于 2013-02-23T04:39:06.863 に答える
0

通常、drawRect:メソッド内ですべての描画を行う必要があります。setNeedsUpdateユーザーがカレンダーの日付をタップすると、メッセージをスケジュール ビューに送信するだけで済みます。次に、スケジュール ビューが自動的に再描画され、独自のdrawRect:メソッドが呼び出されます。

setNeedsDisplayInRect:(または)を呼び出すsetNeedsDisplayと、レシーバーを再描画する必要があることがシステムに通知されるだけです。メソッドは、後で実際の描画を実行するのに適したdrawRect:時点で呼び出されます。

于 2013-02-18T00:08:45.127 に答える
0

この質問は意味がありません。UIView の描画をクリアできないため、このデザインは実行できません。

現在、スケジュール グリッドの上に UITableViews または UIView サブビューを使用することを検討していますが、これにより新しい問題が発生します。

コメントありがとうございます。

于 2013-02-19T16:14:37.513 に答える
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 に答える