1. ホーム
  2. iphone

[解決済み] UIViewの下に影を描くには?

2022-03-15 01:13:38

質問

の下端に影をつけたいのですが、どうすればいいですか? UIView をCocoa Touchで作成しました。を使うべきことは理解しています。 CGContextSetShadow() を使用して影を描画していますが、Quartz 2D プログラミング ガイドは少し曖昧です。

  1. グラフィックの状態を保存します。
  2. 関数を呼び出す CGContextSetShadow 適切な値を渡します。
  3. 影をつけたい描画をすべて実行します。
  4. グラフィックスの状態を復元する

を試したところ、以下のように UIView のサブクラスです。

- (void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
    CGContextRestoreGState(currentContext);
    [super drawRect: rect];
}

...しかし、これではうまくいかないので、(a) 次はどこに行けばいいのか、(b) 私の UIView を使えば、うまくいくのでしょうか?

解決方法は?

現在のコードでは GState そして、影を描画するように設定する前の状態に復元します。そして最後に、スーパークラスが実装する drawRect : .

シャドウの設定に影響されるような描画が必要な場合

CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);

しかし 以前

CGContextRestoreGState(currentContext);

ですから、もしスーパークラスの drawRect: をシャドウで「包む」ようにするには、次のようにコードを並べ替えてはどうでしょうか?

- (void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
    [super drawRect: rect];
    CGContextRestoreGState(currentContext);
}