如何在 UIBezierPath 上设置填充颜色变化的动画?

2024-03-22

形状一开始就被正确填充,但我不知道如何更改填充颜色,或者更好的是,如何在动画上更改填充颜色UIBezierPath。就像我正在寻找的改变 UIView 的背景颜色一样。

var fillColor = UIColor()

func changeBackgroundColor() {

    let animcolor = CABasicAnimation(keyPath: "fillColor")
    animcolor.fromValue = UIColor.greenColor()
    animcolor.toValue = UIColor.orangeColor()
    animcolor.duration = 1.0;
    animcolor.repeatCount = 0;
    animcolor.autoreverses = true
    shapeLayer.addAnimation(animcolor, forKey: "fillColor")

}


var fillColor = UIColor()
let clipPath = UIBezierPath()
let shapeLayer = CAShapeLayer()

override func drawRect(rect: CGRect) {

        clipPath.moveToPoint(CGPointMake(self.bounds.minX + 7.65, self.bounds.minY - 0.25))
        clipPath.addCurveToPoint(CGPointMake(self.bounds.minX + 7.65, self.bounds.minY + 36.1), controlPoint1: CGPointMake(self.bounds.minX - 2.38, self.bounds.minY + 9.79), controlPoint2: CGPointMake(self.bounds.minX - 2.38, self.bounds.minY + 26.06))
        clipPath.addCurveToPoint(CGPointMake(self.bounds.minX + 43.99, self.bounds.minY + 36.1), controlPoint1: CGPointMake(self.bounds.minX + 17.69, self.bounds.minY + 46.13), controlPoint2: CGPointMake(self.bounds.minX + 33.96, self.bounds.minY + 46.13))
        clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 43.99, self.bounds.minY + 36.1))
        clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 44.01, self.bounds.minY + 0.19))
        clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 7.58, self.bounds.minY + 0.19))
        clipPath.usesEvenOddFillRule = true
        fillColor = userColor
    }

clipPath.addClip()
fillColor.setFill()
clipPath.fill()
shapeLayer.path = clipPath.CGPath
self.layer.mask = shapeLayer

就像我正在寻找的改变 UIView 的背景颜色一样。

But why你不能完全那样做吗?您已经将视图遮盖到您的路径上 - 因此设置背景颜色的动画将达到您想要的确切效果。只需摆脱 Core Graphics 路径填充 - 并删除drawRect覆盖,如你不能使用drawRect带有背景动画 https://stackoverflow.com/a/28902900/2976878.

If you really需要使用drawRect并设置颜色动画,您可以考虑拆分您的UIView一分为二UIViews- 一个用于绘制背景图层(您可以为其设置动画),另一个用于绘制自定义绘图。或者,你could设置一个CADisplayLink使用中间背景颜色重新绘制每一帧的视图 - 但这在性能方面并不令人惊奇。

正如我下面所说,你不能为 a 的填充颜色设置动画UIBezierPath直接地。如果您只想使用现有代码更改(而不是动画)填充颜色,那么您只需调用setNeedsDisplay与不同的userColor.

如果您问这个问题是因为您使用两种不同的路径进行掩蔽和填充,请参阅我下面的答案(事后看来过于复杂)。


问题是 a 的填充颜色UIBezierPath不可设置动画。但是a上的填充颜色CAShapeLayer is.

因此你想使用另一个CAShapeLayer代替填充物。我建议你创建一个fillLayer and a maskLayer属性,以明确其功能。现在,因为您使用的是 100% 分层方法,所以您可以将代码移出drawRect,因为您不再进行任何 Core Graphics 绘图。

另外,值得注意的是,您需要使用CGColor用于往返值的动画。

像这样的事情应该可以解决问题:

var fillColor = UIColor.greenColor()
let maskLayer = CAShapeLayer()
let fillLayer = CAShapeLayer()

func changeBackgroundColor() {

    let animcolor = CABasicAnimation(keyPath: "fillColor")
    animcolor.fromValue = UIColor.greenColor().CGColor
    animcolor.toValue = UIColor.orangeColor().CGColor
    animcolor.duration = 1.0;
    animcolor.repeatCount = 0;
    animcolor.autoreverses = true
    fillLayer.addAnimation(animcolor, forKey: "fillColor")

}

// re-adjust the clipping path when the view bounds changes
override func layoutSubviews() {

    let clipPath = UIBezierPath()
    clipPath.moveToPoint(CGPointMake(self.bounds.minX + 7.65, self.bounds.minY - 0.25))
    clipPath.addCurveToPoint(CGPointMake(self.bounds.minX + 7.65, self.bounds.minY + 36.1), controlPoint1: CGPointMake(self.bounds.minX - 2.38, self.bounds.minY + 9.79), controlPoint2: CGPointMake(self.bounds.minX - 2.38, self.bounds.minY + 26.06))
    clipPath.addCurveToPoint(CGPointMake(self.bounds.minX + 43.99, self.bounds.minY + 36.1), controlPoint1: CGPointMake(self.bounds.minX + 17.69, self.bounds.minY + 46.13), controlPoint2: CGPointMake(self.bounds.minX + 33.96, self.bounds.minY + 46.13))
    clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 43.99, self.bounds.minY + 36.1))
    clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 44.01, self.bounds.minY + 0.19))
    clipPath.addLineToPoint(CGPointMake(self.bounds.minX + 7.58, self.bounds.minY + 0.19))

    // update layer paths
    fillLayer.path = clipPath.CGPath
    maskLayer.path = clipPath.CGPath

}

override init(frame: CGRect) {
    super.init(frame: frame)

    // configure filling
    fillLayer.fillColor = fillColor.CGColor
    fillLayer.fillRule = kCAFillRuleEvenOdd

    // add fill path to superlayer
    layer.addSublayer(fillLayer)

    // configure masking layer
    maskLayer.fillRule = kCAFillRuleEvenOdd
    layer.mask = maskLayer
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 UIBezierPath 上设置填充颜色变化的动画? 的相关文章

  • 防止点击 MKAnnotation 时检测到 MKMapView 上的触摸事件

    我有一个 UITapGestureRecognizer 当用户点击地图时 它将在我的 MKMap 上隐藏和显示工具栏 简单 但是 当用户点击 MKMapAnnotation 时 我不希望地图以正常方式响应点击 如上所述 此外 当用户点击地图
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • 删除具有estimatedItemSize 的项目时 UICollectionView 单元格大小会调整

    我有一个简单的项目 其中的故事板仅包含一个UICollectionViewController 使用 Xcode 7 1 1 为 iOS 9 1 构建 class ViewController UICollectionViewControl
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • 以编程方式向 UIButton 标签添加阴影

    我试图向按钮标签添加 1px 黑色阴影 但没有成功 我试过这个 self setTitleShadowOffset CGSizeMake 0 1 但我得到 请求非结构或联合中的成员 setTitleShadowOffset 任何建议都会很棒
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • 在 UITextView 上添加具有自定义间距和文本的图像

    I want to add Image on text view and want proper spacing as shown in screenshot 我尝试在文本视图上添加图像 但在根据要求放置文本时遇到问题 请向我提供有关同样的
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • 从 iOS 应用程序打开 YouTube 频道的最新 URL 方案是什么 [重复]

    这个问题在这里已经有答案了 我想使用 iPhone 应用程序中的频道打开 Youtube 应用程序 以前我使用以下 URL 方案并且工作正常 youtube 用户 频道名称 但在我将 Youtube 应用程序更新到最新的 2 6 0 后 这
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • iOS 设置 MKMapView 中心,因此提供的位置位于底部中心

    我有一个 MKMapView 和一个永不改变的 CLLocationCooperative2D 我想做的是将地图居中 以便该坐标将放置在地图的底部中心 我可以用简单的方法将地图集中在这个坐标上 MKCoordinateRegion view
  • 如何获取 UITableView 中的所有单元格

    假设我有一个包含多行的 UITableView 我想在某个时间点将所有 UITableViewCells 作为 NSArray 获取 我努力了 tableView visibleCells 但这种方法有一个问题 我无法拥有当前不在当前屏幕中
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 如何以编程方式使用资产目录图像的切片信息?

    我的项目中曾经有一个图像 我会像这样加载它 UIImage image UIImage imageNamed image name resizableImageWithCapInsets UIEdgeInsetsMake 10 0f 10
  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任

随机推荐

  • 如何使用 ARC 处理“require(..., bail)”语句?

    我正在查看一些示例代码Apple 示例代码中的 Square Cam http developer apple com library ios samplecode SquareCam Introduction Intro html 我想使
  • 获取编辑文本的值错误NULLPOINTER 为什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试从对话框上显示的编辑字段的值获取文本并将其保存在变量中 final Dialog dialog new Dialog contex
  • 在jboss 7.1.1中配置gmail

    我正在使用 jboss 7 1 1 想使用 JavaMail 发送电子邮件 我尝试过以下配置 但出现错误 有人用 Jboss 7 1 1 配置过 gmail 吗
  • 如何从 Java SE 中的 GlassFish 服务器获取初始上下文?

    我有一个如下所示的课程 public class Poligon public static void main String args try Context ctx new InitialContext ConnectionFactor
  • Linux 上的 .NET Core 支持 Visual Basic 吗?

    我搜索了所有 Microsoft 文档 但找不到任何明确说明 Linux 上的 NET Core 是否支持 Visual Basic 的内容 那么 Linux 上的 NET Core 是否支持 Visual Basic 并且是否有适用于 V
  • 如何使用 Xlib 将一个窗口的内容复制到另一个窗口?

    我想使用 Xlib 将现有窗口的内容复制到我自己的窗口 我尝试过 XCopyArea 但它拒绝在两个 Windows 之间复制 我也尝试过 XGetImage 和 XPutImage 但也失败了 将窗口的图形内容复制到我自己的窗口的最佳方法
  • 如何将使用 XIB 的项目转换为 Storyboard?

    我在使用包含导航控制器的 TabBarViewControllers 的项目中有一些复杂的 XIB 文件 从 Xcode 4 2 开始 我无法再有效地编辑这些 XIB 文件 包含的视图控制器是不可见的 仅表示为灰色框 似乎在故事板项目中这是
  • 如何判断网站上是否加载了 Flash?

    我正在对一个非常大的网站进行一些测试 创建了许多不同的开发人员 有没有办法判断网站是否正在使用flash questions tagged flash和 或已加载闪存plugin questions tagged plugin 如果页面使用
  • 有人可以向我解释一下这段代码是如何工作的吗?(如果需要数字值并且用户输入其他输入,则程序再次要求用户输入)

    我正在读一本关于 C 的书 C Primer Plus 并找到了这段代码 该程序的目的是 如果用户希望将数字输入读取到 例如数组 gt 1 将cin重置为新输入2 摆脱错误的输入3 提示用户重试 书上原话 这是代码 gt 从书中复制的确切代
  • iOS - 如何将MapView限制到特定区域?

    我有以下问题 我有一个 绘制的地图 图像 我将其作为叠加层添加到 MapView 中 没问题 但我需要将 MapView 限制在覆盖区域 因此用户无法在该区域之外滚动 缩放 但应该可以在 边界 内滚动 缩放覆盖层的 意味着我不能只禁用 Ma
  • Windows Phone 8 上的 PhoneGap 和外部链接

    我正在尝试使用 Phonegap 在 Windows Phone 8 上设置电子商店应用程序 当客户选择要购买的商品时 他应该被带到 Paypal 窗口 在那里他们可以进行购买 此应用程序不需要购物车功能 我希望在手机上的本机浏览器中打开链
  • iOS 7 自定义字体对齐

    在 iOS 6 上实现应用程序布局时 我使用了自定义 TTF 字体 Gotham 我注意到它的基线总是比常规字体高一点 但只是稍微调整一下以适应 现在我已经更新到 iOS 7 SDK 在 iOS 7 设备上运行时 字体位置更接近常规字体 但
  • .NET 私​​钥 Rsa 加密

    我需要使用 RSA 1 5 算法加密字符串 我已获得私钥 然而 我一生都无法弄清楚如何将这个密钥添加到班级中 看来密钥必须是 RSAParameter 结构类型 然而 这需要一组我尚未给出的值 例如模数 指数 P Q 等 我拥有的只是私钥
  • 如何在Python中的多个进程之间共享单个MySQL数据库连接

    如何创建单个数据库连接并让每个进程与其通信 以最大限度地减少每次迭代生成新连接的开销 这是一些示例代码来说明我想要做什么 import multiprocessing import os path import hashlib import
  • 将包管理默认为 PackageReference

    Nuget Config 中是否有任何方法可以将包管理选项默认为 PackageReference 我会假设不 因为我没有看到它here https learn microsoft com en us nuget reference nug
  • 如何获取findElementById方法?

    我通过 Maven 依赖项将 Selenium 最新版本 3 3 1 加载到我的系统中 在尝试编码时 我无法获取该方法findElementById 相反 我只得到旧方法findElement 谁能帮我 注意 在maven中 仅显示最新版本
  • 理解 NSManagedObject

    在现有项目中 我尝试在项目创建很久之后引入 Core Data 因此它的模型已经就位 我已经创建了 xcdatamodel 并向其中添加了我唯一的类 该类应该充当我的应用程序中对象的全局存储 该类正确实现了 NSManagedObject
  • java.lang.BootstrapMethodError:初始化 Retrofit 时,调用站点 #4 引导方法出现异常

    我正在使用改造从 获取样本数据https jsonplaceholder typicode com comments https jsonplaceholder typicode com comments 但我收到此错误 2020 03 3
  • OpenCV作为JBoss-作为全局模块

    问题呈现 我尝试将 OpenCV 安装为 JBoss as 实例的全局模块 版本是 JBoss as 7 1 1 最终版 OpenCV 2 4 5 编译时支持 Java 我从全新安装 Ubuntu Server 12 04 64 位开始 仅
  • 如何在 UIBezierPath 上设置填充颜色变化的动画?

    形状一开始就被正确填充 但我不知道如何更改填充颜色 或者更好的是 如何在动画上更改填充颜色UIBezierPath 就像我正在寻找的改变 UIView 的背景颜色一样 var fillColor UIColor func changeBac