如何用渐变填充 UIBezierPath?

2024-01-21

我使用 UIBezierPath 绘制了一个图表。我可以用纯色填充图表下方的区域,但我想用渐变而不是纯色填充图表下方的区域。但我不确定如何使渐变仅适用于图表而不适用于整个视图,我已经阅读了一些问题,但没有发现任何适用的内容。

这是主要的绘图代码:

// Draw the graph
UIBezierPath *barGraph = [UIBezierPath bezierPath];
barGraph.lineWidth = 1.0f;
[blueColor setStroke];
TCDataPoint *dataPoint = self.testData[0];
CGFloat x = [self convertTimeToXPoint:dataPoint.time];
CGFloat y = [self convertDataToYPoint:dataPoint.dataUsage];
CGPoint plotPoint = CGPointMake(x,y);
[barGraph moveToPoint:plotPoint];
for (int ii = 1; ii < [self.testData count]; ++ii)
{
    dataPoint = self.testData[ii];
    x = [self convertTimeToXPoint:dataPoint.time];
    y = [self convertDataToYPoint:dataPoint.dataUsage];
    plotPoint = CGPointMake(x, y);
    [barGraph addLineToPoint:plotPoint];
}
[barGraph stroke];

我一直在尝试通过试验如下代码来填充图表,但说实话,尽管阅读了各种教程和文档,但我并不能 %100 确定我在做什么:

[barGraph closePath];

CGFloat colors [] = {
    1.0, 0.0, 0.0, 1.0,
    1.0, 1.0, 1.0, 1.0
};

CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2);
CGColorSpaceRelease(baseSpace);

CGPoint startPoint = CGPointMake(CGRectGetMidX(self.bounds), self.topY);
CGPoint endPoint = CGPointMake(CGRectGetMidX(self.bounds), self.bottomY);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient);

最简单的方法是使用原始图形贝塞尔曲线路径来帮助您构建蒙版并将该蒙版施加到渐变层上。现在将图形层施加在渐变层的顶部。

因此,例如,制作一个CAShapeLayer,关闭图形贝塞尔曲线路径,将其路径设置为形状图层的路径,并将其填充为黑色。现在您有了一个遮罩,它是图表下方区域的形状。现在创建一个 CAGradientLayer 并将 CAShapeLayer 设为其mask。在其前面放置实际的图表。

例如(EDITED):

这是我用来创建该绘图的代码(我的贝塞尔曲线路径非常简单,只是由三条线连接的四个点,但您可以清楚地看到它下面的区域是渐变):

CAShapeLayer* shape = [[CAShapeLayer alloc] init];
shape.frame = self.graph.bounds;
CGFloat h = shape.frame.size.height;
CGFloat w = shape.frame.size.width;

NSArray* points = @[
                    [NSValue valueWithCGPoint:CGPointMake(0,h-50)],
                    [NSValue valueWithCGPoint:CGPointMake(70,h-100)],
                    [NSValue valueWithCGPoint:CGPointMake(140,h-75)],
                    [NSValue valueWithCGPoint:CGPointMake(w,h-150)],
                    ];

UIBezierPath* p = [UIBezierPath new];
[p moveToPoint:[points[0] CGPointValue]];
for (NSInteger i = 1; i < points.count; i++)
    [p addLineToPoint:[points[i] CGPointValue]];

shape.path = p.CGPath;
shape.strokeColor = [UIColor blackColor].CGColor;
shape.lineWidth = 2;
shape.fillColor = nil;

CAGradientLayer* grad = [[CAGradientLayer alloc] init];
grad.frame = self.graph.bounds;
grad.colors = @[(id)[UIColor blueColor].CGColor,
                (id)[UIColor yellowColor].CGColor];

CAShapeLayer* mask = [[CAShapeLayer alloc] init];
mask.frame = self.graph.bounds;
[p addLineToPoint:CGPointMake(w,h)];
[p addLineToPoint:CGPointMake(0,h)];
[p closePath];
mask.path = p.CGPath;
mask.fillColor = [UIColor blackColor].CGColor;
grad.mask = mask;

[self.graph.layer addSublayer:grad];
[self.graph.layer addSublayer:shape];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用渐变填充 UIBezierPath? 的相关文章

  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 在 Xcode 5 中重命名 iOS 项目[重复]

    这个问题在这里已经有答案了 我需要重命名一个 iOS 项目 有没有办法在不开始一个全新项目的情况下做到这一点 我发现的所有其他信息都与 Xcode 4 或旧版本相关 这些方法似乎使项目崩溃 我在尝试任何名称更改之前创建了一个快照 在 Xco
  • 在 Swift 中从 UIScrollView 创建 PDF 文件

    我想从 UIScrollView 的内容创建一个 PDF 文件 func createPdfFromView aView UIView saveToDocumentsWithFileName fileName String let pdfD
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • 在 iOS 上将 NSString 转换为 NSDate 的正确方法?

    我一直在使用此方法将常规 NSString 对象转换为 NSDate 但尝试向 Apple 提交更新 但遭到拒绝 在 iOS 中还有什么其他方法可以做到这一点 NSString date str 2011 08 12T12 20 00Z N
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后
  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • 如何在 iOS 13 中将 UISegmentedControl 的背景颜色设置为白色

    iOS 13 对 UISegmentedControl 进行了一些更改 包括切换所选片段时的非常漂亮的动画 但是我注意到它没有显示backgroundColor属性正确 它似乎总是有一点色彩 我见过回答如何设置的问题selectedSegm
  • 将类型传递给通用 Swift 扩展,或者理想情况下推断它

    说你有 class Fancy UIView 你想找到所有兄弟姐妹Fancy意见 没问题 https stackoverflow com q 37232743 294884 for v UIView in superview subview
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • 如何使用phonegap在iOS应用程序中防止键盘推送webview

    当屏幕底部的输入字段获得焦点时 键盘会向上推我的网络视图 并且页面的上部不再可见 我想防止键盘推高网络视图 有人有主意吗 对焦 设置window scrollTo 0 0 这可以防止键盘完全推高 webview input on focus
  • AVAudioPlayer 无法从网站播放 m4a 或 mp3 文件类型

    我试图在我的应用程序中找到一个仅纯 m4a 声音的 URL 我有音频的 URL 理论上可以下载它 然后 使用下载的文件URL到声音 我尝试使用AVAudioPlayer播放它 但它不播放任何声音 这是我的代码 在 URL 检索函数中 我调用
  • 使用 UITabBarController 时覆盖整个屏幕的视图?

    我想在 UITabBarController 设置中在整个屏幕上覆盖 HUD 样式的透明图形 执行此操作的按钮位于第一个选项卡的屏幕 FirstViewController 中 并且覆盖层也应该覆盖选项卡 这可能吗 您可以将新视图直接附加到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 从现有坐标地图套件中查找最近的位置

    我正在为拥有多家商店的客户开发 iPhone 应用程序 目标 C 我有数组中所有商店 20 的坐标 纬度 长 目前我正在考虑循环遍历商店坐标数组并获取从用户当前位置到商店位置的距离 然后将它们添加到数组中并按最小距离进行排序 这是正确的方法
  • Fitbit oauth2 公共 API 停止工作。给出错误 - 抱歉,这不是你..是我们

    几个月前 我准备了一个关于 Fitbit oauth2 公共 API 的演示 其中我使用特定用户登录并获取他的活动 一切正常 但最近 我打开演示并尝试使用同一用户登录 但它没有登录并反复出现此错误 我尝试更改在 Fitbit 上注册的演示应
  • 如何在 UITableView 的 switch 语句中创建变量?

    我正在构建一个包含三个部分的 tableView 我已经完成了前两个工作 但最后一个有点阻力 我的问题似乎涉及尝试在 switch 语句中声明变量 实际上是嵌套的 switch 语句 据我所知 这不是一个好主意 但在这种情况下 这似乎是唯一

随机推荐

  • 添加到 Windows 的 ios 8 视图的旋转问题

    I have created category for view rotation And added views on controllers view as well as on window for showing custom in
  • 为什么 Honeywell POS4NET 会为两个不同的扫描仪触发相同的事件?

    我想读取两个霍尼韦尔扫描仪的输入 即航行者1202克 and 轨道7190克 对于某些业务需求 需要在同一台计算机上使用这两种设备 Both扫描仪使用 Honeywell POS4NET 驱动程序 我需要知道 which扫描仪正在传送数据
  • 如何在flutter中实现圆角底部Appbar?

    我想创建一个像这样的圆形底部应用栏 圆角底部应用栏 但它看起来像这样 编码的BottomAppBar How do I get rid of that white portion return ClipRRect borderRadius
  • 使用 Swift 通过键盘移动视图

    我有一个应用程序 在视图的下半部分有一个文本字段 这意味着当我在文本字段中输入内容时 键盘会覆盖文本字段 我如何在打字时向上移动视图 以便可以看到我正在输入的内容 然后在键盘消失时将其移回到原来的位置 我到处都看过 但所有解决方案似乎都在
  • 原则 2 按 ASC 和最后的空值排序

    我正在尝试获取结果 并且我需要按升序排序 但有些值可能为空 空 我需要将其放在最后 同时排序从 0 1 2 开始 然后为空值 我尝试了 SortableNullsWalker 但没有帮助 我正在排序的值不是列 它是正在排序的两个值的乘法 这
  • 如果可能的话,如何为 python 3.5+、3.6 构建 .exe?

    现在是否有一个简单的协议可以使用模块 pyqtgraph qt5 theano pymc3 numpy scipy os 和 sys 从 python 3 5 构建 exe 并打开存储在 ui 文件中的简单 GUI 我浪费了几个小时 最终没
  • 如何为每个输入预先计算一个掩码并根据该掩码调整权重?

    我想提供一个与输入图像大小相同的掩码 并根据该掩码调整从图像中学习到的权重 类似于注意力 但为每个图像输入预先计算 如何使用 Keras 或 TensorFlow 做到这一点 Question 如何向图像添加另一个特征层 例如掩模 并让神经
  • java中未选中和选中复选框的httpservlet请求getparameter

    我的表单上有几个复选框 大约 15 个 我遇到的问题是 复选框的名称仅在选中时出现在枚举中 但我希望返回所有复选框 以便在打印数据时将显示复选框的名称并显示 已选中 或 未选中 我曾想过一种方法 我可以手动设置标志来查看存在的内容和不存在的
  • 名称“驱动程序”未定义,Selenium Webdriver python3

    我正在尝试使用 Selenium WebDriver Chrome 打开一个网站 但由于我的代码不断产生错误 所以还没有实现 我已经通过将 Chrome 驱动程序目录中的 加倍来修复了一个问题 我正在使用Pycharm 我想知道为什么会发生
  • 使用 beautifulsoup 'NoneType' 对象进行网页抓取没有属性 'get_text'

    我正在尝试学习 beautifulsoupscrape纽约时报政治文章中的文本 目前使用我现在拥有的代码 它确实设法浏览了两个段落 但在那之后 它吐出了 AttributeError NoneType object has no attri
  • 如何在cordova应用程序中创建“离线模式”?

    我必须为平板电脑 Android 开发一个应用程序 该应用程序将由一些在不同地方的人使用 这些地方的互联网连接并不总是可用 但这个应用程序需要数据才能工作 用户必须能够在有或没有互联网接入的情况下使用该功能 我们将与 cordova 合作构
  • 如何使用发布构建工件任务发布特定文件

    我正在使用 Visual Studio Build In Azure Pipeline 构建 C 应用程序 我的解决方案包含多个项目 Manager Web 和 Web API 我想分别发布两个单独的 Artifact ManagerWeb
  • Jest 的 `it.each()` 描述用于在引用 $predicate 时呈现箭头函数源代码

    问题定义 Jest 允许测试用例的数据用于it each s name via 前缀变量 下面的代码产生如下输出 PASS src array functions find pairwise spec ts findPairwise sho
  • 如何将 Bootstrap 与 Django 一起使用?

    我正在从 PHP 学习 python 和 Django 这一切都非常令人兴奋 我很乐意使用 Bootstrap 和 Django 来创建性感的网页 据我了解 我正在关注他们网站上的 Django 教程 Django 使用 应用程序 它可以包
  • 需要 Magento 模型的文档 (Mage::getModel())

    我读过艾伦 斯托姆的指南here http www magentocommerce com knowledge base entry magento for dev part 5 magento models and orm basics关
  • 在 IE11 上使用 Babel 扩展运算符

    我想使用扩展运算符转译为Babel在 IE11 上 但这不起作用 const navigationItemSubmenu document querySelectorAll data target navigationItemSubmenu
  • iPhone操作系统3.2; PDF渲染;用户互动

    我需要创建一个 iPad 应用程序来渲染多个 PDF 文件 一个文件包含一页 每个页面都应该是可滚动 可缩放的 如果用户点击 PDF 的一部分 应该会弹出一个网站或照片库 目前我认为我可以通过以下方式做到这一点 A UIWebView 很好
  • OpenCV 从采集卡或 OBS Studio FaceRecogition 加载视频

    我正在创建一个概念证明 我有一个闭路电视设置 我可以访问的唯一输出是 HDMI 端口 我可以使用采集卡或 OBS 作为 openCV 的输入吗 使用带有 PiCam 的树莓派 所以我对功能的限制有点迷失 这对我使用 USB HDMI 采集卡
  • 如何在 DOS 汇编中正确挂接中断 28h 并恢复它?

    我试图将中断28h的处理程序设置为我自己的例程 恢复所有涉及的寄存器和标志 并恢复原始的中断处理程序 我在 VirtualBox 中的 DOSBox 和 MS DOS 6 22 下使用 NASM Assembler 我考虑过调试 但在 TS
  • 如何用渐变填充 UIBezierPath?

    我使用 UIBezierPath 绘制了一个图表 我可以用纯色填充图表下方的区域 但我想用渐变而不是纯色填充图表下方的区域 但我不确定如何使渐变仅适用于图表而不适用于整个视图 我已经阅读了一些问题 但没有发现任何适用的内容 这是主要的绘图代