5

そのようです:

ここに画像の説明を入力

これは では機能しないことはわかっていますがNSShadow、描画しても問題なく機能しdrawRect:ます。

4

4 に答える 4

2

完璧にはほど遠いですが、あなたが探しているような影を描いていると思います. 完全な黒からクリアな色への単純な線形グラデーションをそのままにしてあることに注意してください. 非常に暗いため、値を少し調整しない限り、超リアルな影は得られません。さまざまなアルファ値を持つ場所をさらに追加して、グラデーションを操作して、好きなステップを取得したい場合があります。いくつかの実験が必要になるかもしれませんが、値はすべて揃っています。

あなたの提案によると、それはdrawRect:(CGRect)rect事です。カスタム ビューを作成し、それをオーバーライドするだけです。

- (void)drawRect:(CGRect)rect {
    // Get the context
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Setup the gradient locations. We just want 0 and 1 as in the start and end of the gradient.
    CGFloat locations[2] = { 0.0, 1.0 };

    // Setup the two colors for the locations. A plain black and a plain black with alpha 0.0 ;-)
    CGFloat colors[8] = { 0.0f, 0.0f, 0.0f, 1.0f,   // Start color
                          0.0f, 0.0f, 0.0f, 0.0f }; // End color

    // Build the gradient
    CGGradientRef gradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(),
                                                                 colors,
                                                                 locations,
                                                                 2);

    // Load a transformation matrix that will squash the gradient in the current context
    CGContextScaleCTM(context,1.0f,0.1f);

    // Draw the gradient
    CGContextDrawRadialGradient(context,                                    // The context
                                gradient,                                   // The gradient
                                CGPointMake(self.bounds.size.width/2,0.0f), // Starting point
                                0.0f,                                       // Starting redius
                                CGPointMake(self.bounds.size.width/2,0.0f), // Ending point
                                self.bounds.size.width/2,                   // Ending radius
                                kCGGradientDrawsBeforeStartLocation);       // Options

    // Release it an pray that everything was well written
    CGGradientRelease(gradient);
}

私の画面ではこんな感じ…

結果の影

影のすぐ上に画像を配置しただけですが、UIImageView をサブクラス化して drawRect メソッドをオーバーライドすると、影を画像と簡単にマージできます。

ご覧のとおり、私が行ったことは単純に円形グラデーションを設定することでしたが、コンテキストに描画する前にそれを押しつぶすためにスケーリング マトリックスをロードしました。そのメソッドで何か他のことをする予定がある場合は、マトリックスが配置されており、実行するすべてがマトリックスによって変形されることを覚えておいてください。マトリックスをロードする前に CTM を保存してからCGContextSaveGState()、元の状態に戻すことができます。CGContextRestoreGState()

これがあなたが探していたものであることを願っています。

乾杯。

于 2013-09-10T00:01:54.717 に答える
1

コードでこれを行う方法、またはこのコードを生成するツールの使用方法を説明できます。私は後者を選びます。

画像

PaintCodeを使用します(無料のデモが利用可能、セッションごとに 1 時間の制限があります)。

  1. 楕円を描く
  2. 楕円の底と交差する長方形を描きます。
  3. 左上隅の「オブジェクト」リストで、長方形と楕円形の両方を CMD クリックします。
  4. ツールバーの交差ボタンを押します。
  5. [オブジェクト] リストからベジエを選択します。
  6. そのストロークを「ストロークなし」に設定します
  7. [グラデーション] ボタン (選択インスペクターの下の左側にあります) をクリックします。
  8. 「+」ボタンを押す
  9. グラデーションの色をライト グレーに変更します。
  10. 選択インスペクタから、塗りつぶしスタイルを「グラデーション」に変更します
  11. グラデーションを選択: 線形

満足するまでグラデーションを調整します。

于 2013-09-09T20:45:37.377 に答える