我试图在Cocoa Touch的 UIView
的底部边缘画一个阴影 . 我知道我应该使用 CGContextSetShadow()
绘制阴影,但Quartz 2D编程指南有点含糊:
-
保存图形状态 .
-
调用函数
CGContextSetShadow
,传递适当的值 . -
执行要应用阴影的所有图形 .
-
恢复图形状态
我在 UIView
子类中尝试了以下内容:
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
CGContextRestoreGState(currentContext);
[super drawRect: rect];
}
..但是这对于(a)接下来要去哪里以及(b)如果有什么我需要对我的 UIView
进行这项工作有点困难?
14 回答
在当前代码中,保存当前上下文的
GState
,将其配置为绘制阴影..并将其恢复为将其配置为绘制阴影之前的状态 . 然后,最后,您调用超类的drawRect
实现: .任何应该受阴影设置影响的绘图都需要在之后发生
但之前
所以,如果你希望超类的
drawRect:
在阴影中是'wrapped',那么如果重新安排你的代码怎么样呢?一种更简单的方法是在初始化时设置视图的一些图层属性:
您需要导入QuartzCore .
这会降低应用程序的速度 . 只要您的视图明显是矩形,添加以下行可以提高性能:
相同的解决方案,但只是提醒您:您可以直接在故事板中定义阴影 .
例如:
你可以尝试这个......你可以玩这些值 .
shadowRadius
决定了模糊量 .shadowOffset
指示阴影的去向 .使用Interface Builder简单而干净的解决方案
在项目中添加名为UIView.swift的文件(或者只将其粘贴到任何文件中):
然后,这将在Interface Builder中为Utilities面板> Attributes Inspector中的每个视图提供:
您现在可以轻松设置阴影 .
笔记:
我用它作为我的utils的一部分 . 有了这个,我们不仅可以设置阴影,还可以为任何
UIView
获得圆角 . 您也可以设置您喜欢的颜色阴影 . 通常黑色是首选,但有时,当背景为非白色时,您可能需要其他东西 . 这是我用的 -要使用它,我们需要调用它 -
[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];
斯威夫特3
对于那些在尝试所有答案后未能使其工作的人(正如我自己!),只需确保在属性检查器中未启用 Clip Subviews ...
如果您想使用StoryBoard并且不想继续输入运行时属性,您可以轻松地创建视图扩展并使其在故事板中可用 .
第1步 . 创建扩展
第2步 . 您现在可以在故事板中使用这些属性
您可以使用我为阴影和角半径创建的效用函数,如下所示:
希望它能帮到你!!!
所有答案都很好,但我想补充一点
如果在有表格单元格时遇到问题,则Deque新单元格中的阴影不匹配,因此在这种情况下,您需要将影子代码放在layoutSubviews方法中,以便它在所有条件下都能很好地运行 .
或者在ViewControllers中为特定视图放置以下方法中的阴影代码,以便它能够正常工作
我为新的开发者修改了我的阴影实现,以获得更广泛的形式ex:
斯威夫特3
对于Xamarians同事,答案的Xamarin.iOS / C#版本如下所示:
主要区别在于您获取了
CGContext
的实例,您可以在其上直接调用相应的方法 .