2

UIVIew のデリゲート メソッドがあり、drawRect メソッドに UIBezierPath を追加して、正方形に影を表示します。

 //// General Declarations
 CGContextRef context = UIGraphicsGetCurrentContext();

 //// Shadow Declarations
 UIColor* shadow = [UIColor blackColor];
 CGSize shadowOffset = CGSizeMake(0, -0);
 CGFloat shadowBlurRadius = 15;


 //// Rectangle Drawing
 rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(8, 8, 44, 44)];
 CGContextSaveGState(context);
 CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
 [[UIColor whiteColor] setFill];
 [rectanglePath fill];
 CGContextRestoreGState(context);

次に、特定の基準に基づいて影の色を変更したいので、makeRed というメソッドを作成します。

- (void)makeRed {
  NSLog(@"makeRed");
  CGContextRef context = UIGraphicsGetCurrentContext();
  // Shadow Declarations
  UIColor* shadow = [UIColor redColor];
  CGSize shadowOffset = CGSizeMake(0, -0);
  CGFloat shadowBlurRadius = 15;
  CGContextSaveGState(context);
  CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
  [[UIColor whiteColor] setFill];
  [rectanglePath fill];
  CGContextRestoreGState(context);
}

しかし、メソッドを呼び出すと、次のメッセージが表示されます。

: CGContextSaveGState: 無効なコンテキスト 0x0

正しいコンテキストを設定するか、影の色を別の方法で変更する方法はありますか?

デリゲートには他の属性があるため、影の最初の描画は完全に機能することに注意してください。つまり、影を作成する .layer メソッドを使用する派手なアニメーションは機能しません。

乾杯

4

1 に答える 1

2

UIViewドキュメントで見ることができますdrawRect:

このメソッドが呼び出されるまでに、UIKit はビューに適した描画環境を構成しており、コンテンツをレンダリングするために必要な描画メソッドと関数を簡単に呼び出すことができます。

したがって、drawRect:描画コンテキストが正しく設定されているなど、内部で行う描画は正しいですが、これはmakeRedメソッドには当てはまりません。

ivarshadowColorを用意し、これをメソッド内で使用することをお勧めしますdrawRect:。あなたmakeRedはこのようになります

- (void)makeRed;
{
  self.shadowColor = [UIColor redColor];
  [self setNeedsDisplay];
}

次に、行を次のように変更しdrawRect:ます

CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, self.shadowColor.CGColor);

setNeedsDisplayUIKitビューを再描画したいことを伝えるために使用され、その結果、drawRect:再度呼び出されます。

もちろん_shadowColor = [UIColor blackColor]init*メソッドで初期化する必要があります。

于 2012-09-27T23:44:21.167 に答える