在UIView中创建内部阴影

时间:2012-02-09 16:11:08

标签: objective-c ios xcode ipad

我想在iPad上的UIView上创建一个内部阴影:

UIView with shadow

UIView可能会改变大小,因此我无法使用简单的图像来创建这种阴影。

我已经使用setShadow等进行了测试,但它只是创建了一个阴影。

知道如何制作这种影子吗?

3 个答案:

答案 0 :(得分:9)

你可能觉得它很有用,我为它做了一个UIView类别

https://github.com/Seitk/UIView-Shadow-Maker

答案 1 :(得分:6)

将阴影创建为特定大小的透明图层,然后创建一个可伸缩的图像,如下所示:

UIImage *shadowImage = [UIImage imageNamed:@"shadow.png"];
shadowImage = [shadowImage stretchableImageWithLeftCapWidth:floorf(shadowImage.size.width/2) topCapHeight:floorf(shadowImage.size.height/2)];

然后,您可以将其作为图像放在UIImageView中,并使用contentMode缩放以适应它,它将以您希望的方式工作。

让我们说你的观点被称为“myView”。您可以像这样添加阴影:

UIImageView *shadowImageView = [[UIImageView alloc] initWithImage:shadowImage];
shadowImageView.contentMode = UIViewContentModeScaleToFill;
shadowImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
shadowImageView.frame = myView.bounds;
[myView addSubview:shadowImageView];
[shadowImageView release]; // only needed if you aren't using ARC

如果您愿意,也可以在界面构建器中执行大部分操作,只要您在代码中创建可伸展图像本身。

答案 2 :(得分:1)

SO

已经部分回答了这个问题
view.layer.masksToBounds = NO;
view.layer.cornerRadius = 8; // if you like rounded corners
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = 0.5;
CGFloat indent = 10;
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent);
view.layer.shadowPath = [UIBezierPath bezierPathWithRect:innerRect].CGPath;

使用变量,直到它们适合您的阴影风格。

<强>更新

相反,您可以在位于现有视图顶部的较小的居中视图上绘制外部阴影。

CGFloat indent = 10;
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent);
UIView * shadowView = [[UIView alloc] initWithFrame:innerRect];
shadowView.backgroundColor = [UIColor clearColor];
shadowView.layer.masksToBounds = NO;
shadowView.layer.cornerRadius = 8; // if you like rounded corners
shadowView.layer.shadowRadius = 5;
shadowView.layer.shadowOpacity = 0.5;
shadowView.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowView.bounds].CGPath;
[view addSubview:shadowView];
[shadowView release];