24

私はUIViewこのように私の周りに影を描くことをうまく実装しました:

block1.layer.masksToBounds = NO;
block1.layer.shadowOffset = CGSizeMake(0, 0);
block1.layer.shadowRadius = 1;
block1.layer.shadowOpacity = 0.7;

今起こっていることは、私は長方形を持っていて、UIViewその 3 つの側面の周りに影を描き、その側を影なしで残したいということです。

block1.layer.shadowPath新しいを作成して を指定する必要があることは知っていますが、そのUIBezierPath方法がわかりません。

明らかに、設定layer.shadowOffsetは私にとってはうまくいきません。

前もって感謝します!

4

4 に答える 4

49

設定がうまくいかないと言っているのは知ってlayer.shadowOffsetいますが、負の値を入力することは許可されているので、設定するlayer.shadowOffset = CGSizeMake(0.0, -2.0)と、探している効果に近づくことができますが、もちろん、3 つの側面でも同様にしたいと考えています。 .

では、どうぞlayer.shadowPath

UIView *block1 = [[UIView alloc] initWithFrame:CGRectMake(32.0, 32.0, 128.0, 128.0)];
[block1 setBackgroundColor:[UIColor orangeColor]];
[self.view addSubview:block1];

block1.layer.masksToBounds = NO;
block1.layer.shadowOffset = CGSizeMake(0, 0);
block1.layer.shadowRadius = 1;
block1.layer.shadowOpacity = 0.7;

UIBezierPath *path = [UIBezierPath bezierPath];

// Start at the Top Left Corner
[path moveToPoint:CGPointMake(0.0, 0.0)];

// Move to the Top Right Corner
[path addLineToPoint:CGPointMake(CGRectGetWidth(block1.frame), 0.0)];

// Move to the Bottom Right Corner
[path addLineToPoint:CGPointMake(CGRectGetWidth(block1.frame), CGRectGetHeight(block1.frame))];

// This is the extra point in the middle :) Its the secret sauce.
[path addLineToPoint:CGPointMake(CGRectGetWidth(block1.frame) / 2.0, CGRectGetHeight(block1.frame) / 2.0)];

// Move to the Bottom Left Corner
[path addLineToPoint:CGPointMake(0.0, CGRectGetHeight(block1.frame))];

// Move to the Close the Path
[path closePath];

block1.layer.shadowPath = path.CGPath;

そして、何が起こっているのかを理解するために、ここにあなたが描いた実際の影のパスがあります:)

ここに画像の説明を入力

その余分な中間点を他の行の前または後に移動して、どちら側を省略するかを選択することができます。

于 2013-03-29T14:01:48.653 に答える
4

Ryan Poolos の回答を Swift 3.0 に更新する

ライアン・プーロスに感謝

class sampleViewController: UIViewController {
    var block1: UIView! = nil

    override func viewDidLoad() {

        super.viewDidLoad()
        block1 = UIView(frame: CGRect(x: 32.0, y: 32.0, width: 128.0, height: 128.0))
        block1.backgroundColor = UIColor.orange
        self.view.addSubview(block1)

        block1.layer.masksToBounds = false
        block1.layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
        block1.layer.shadowRadius = 1.0
        block1.layer.shadowOpacity = 0.7

        let path = UIBezierPath()

        // Start at the Top Left Corner
        path.move(to: CGPoint(x: 0.0, y: 0.0))

        // Move to the Top Right Corner
        path.addLine(to: CGPoint(x: block1.frame.size.width, y: 0.0))

        // Move to the Bottom Right Corner
        path.addLine(to: CGPoint(x: block1.frame.size.width, y: block1.frame.size.height))

        // This is the extra point in the middle :) Its the secret sauce.
        path.addLine(to: CGPoint(x: block1.frame.size.width/2.0, y: block1.frame.size.height/2.0))

        // Move to the Bottom Left Corner
        path.addLine(to: CGPoint(x: 0.0, y: block1.frame.size.height))

        path.close()

        block1.layer.shadowPath = path.cgPath
    }
}

結果:

画像

于 2016-10-13T03:32:20.523 に答える