我正试着在可可色touch 屏上UIView的底边下画一个阴影.我知道我应该使用CGContextSetShadow()来绘制阴影,但Quartz 2D编程指南有点模糊:

  1. 保存图形状态.
  2. 调用函数CGContextSetShadow,传递适当的值.
  3. 执行要应用阴影的所有图形.
  4. 恢复图形状态

我在UIView子类中try 了以下内容:

- (void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
    CGContextRestoreGState(currentContext);
    [super drawRect: rect];
}

..但这对我不起作用,而且我有点不知道(A)下一步go 哪里,以及(B)我是否需要用我的UIView美元做什么才能做到这一点?

推荐答案

在当前代码中,保存当前上下文的GState,将其配置为绘制阴影.并将其恢复到配置为绘制阴影之前的状态.然后,最后,调用超类的drawRect:实现.

任何应受阴影设置影响的绘制都需要在之后进行

CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);

但是之前

CGContextRestoreGState(currentContext);

所以,如果你想让超类的drawRect:被"包装"在阴影中,那么如果你像这样重新排列你的代码呢?

- (void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
    [super drawRect: rect];
    CGContextRestoreGState(currentContext);
}

Ios相关问答推荐

更新Flutter项目时出错:CocoaPods找不到pod webview_flutter_wkwebview的兼容版本""

如何仅在TextField中的文本发生更改时才执行代码?

在带有可编码的SWIFT5中,可以轻松处理以美元符号开头的JSON密钥,例如$DATE";

如何在iOS中以编程方式推送另一个页面?

如何使用Swift以编程方式更改SVG文件中某些元素的 colored颜色

WatchConnectivity - 从手表配套应用程序在 iOS 设备上启动 AVPlayer

RFID scanner 的蓝牙服务 UUID?

iOS 16 中的状态栏 colored颜色

按钮在 SwiftUI 中没有采用给定的高度和宽度

SignalR 永远不会在 iOS 上使用 Xamarin Forms 启动

访问未定义的 stage_in 金属着色器参数

如何判断 `NSManagedObject` 是否已被删除?

光标未显示在 UITextView 中

为什么 Safari 在使用 iOS 6 设备进行远程调试时显示No Inspectable Applications?

在 iPhone 应用程序中使用 SSL - 出口合规性

水平滚动 UICollectionView 时对齐单元格的中心

使用 swift 从应用程序委托打开视图控制器

在 Objective-C 中将所有文本转换为小写

闭包不能隐式捕获变异的 self 参数

如何立即移动 CALayer(无动画)