在UIViews上制作阴影

时间:2014-02-10 02:24:24

标签: ios uiview shadow

我在自定义的UIView初始化中使用此代码:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        ...

        UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(frame.origin.x, frame.size.height, frame.size.width, 15)];
        self.layer.masksToBounds = NO;
        self.layer.shadowColor = [UIColor blackColor].CGColor;
        self.layer.shadowOffset = CGSizeMake(0.0f, 4.0f);
        self.layer.shadowOpacity = 0.5f;
        self.layer.shadowPath = shadowPath.CGPath;
    }
    return self;
}

尝试制作这样的投影:

1)

enter image description here

但我得到了这个效果:

2)

enter image description here

你可以看到这是我想要实现的颠倒版本。如何制作第一张图像的阴影效果?

2 个答案:

答案 0 :(得分:3)

问题出在您的shadowPath上。

使用CGRectMake(frame.origin.x, frame.size.height, frame.size.width, 15)创建UIBezierPath会设置错误的来源。

首先,origin.x应为0.0f,否则如果您的UIView origin.x != 0.0f,影子将会移动很远。其次,您需要将shadowPath的底部与UIView的底部对齐。

这是使用您的影子代码说明这些问题的UIView的屏幕截图。 (在较低的UIView中,您无法看到阴影,因为它远离屏幕右侧。) Screenshot with incorrect shadowPath

如果将矩形更改为:

,您将看到自己的意图
const CGFloat shadowRectHeight = 15.0f;
CGRect shadowRect = CGRectMake(0.0f, self.bounds.size.height - shadowRectHeight, self.bounds.size.width, shadowRectHeight)];

Screenshot with correct shadowPath

答案 1 :(得分:0)

这样做并设置UIView alpha

CAGradientLayer *gradient = [CAGradientLayer layer];  
gradient.frame = rect;  
gradient.colors = [NSArray arrayWithObjects:(id)[UIColor blackColor].CGColor,   
                                            (id)[UIColor grayColor].CGColor,   
                                            (id)[UIColor blackColor].CGColor,nil];  
[self.layer insertSublayer:gradient atIndex:0];  

您可以添加或删除要显示的UIColor。