Swift 圆形进度条

编程之家收集整理的这篇文章主要介绍了Swift 圆形进度条编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

demo 传送门demo效果图前言ios 10.0因为 UI 做了一些很别致的进度条效果图,而且在网上又找不到合适的三方库,自己在网上查查资料做了出来,然后整理了一下,分享给大家使用首先,这个东西只是用贝赛尔曲线做出来的,并不是很难,做出来只是略微麻烦一点,网上也有很多资料,不过并不是很多,所以我就整理了一下,一是整理备份一下记录,二是分享给大家看下1、绘制这个断断续续的进度条UI 设计很漂亮,但是由于数据过多或过少,导致太难看,最后放弃1.1 初始化一个贝塞尔直线///贝塞尔直线,下方主要介绍关于Swift 圆形进度条的全文内容,希望对你有所帮助。

效果

请添加图片描述

前言

ios 10.0

因为 UI 做了一些很别致的进度条效果图,而且在网上又找不到合适的三方库,自己在网上查查资料做了出来,然后整理了一下,分享给大家使用

首先,这个东西只是用贝赛尔曲线做出来的,并不是很难,做出来只是略微麻烦一点,网上也有很多资料,不过并不是很多,所以我就整理了一下,一是整理备份一下记录,二是分享给大家看下

1、绘制这个断断续续的进度条

UI 设计很漂亮,但是由于数据过多或过少,导致太难看,最后放弃

在这里插入图片描述

1.1 初始化一个贝塞尔直线

///贝塞尔直线
private lazy var path: UIBezIErPath = {
    let bezIErPath = UIBezIErPath()
    bezIErPath.move(to: CGPoint(x: 0, y: 0))
    bezIErPath.addline(to: CGPoint(x: bounds.size.wIDth, y: 0))
    return bezIErPath
}()

1.2 使用CAShapeLayer初始化底部背景线,和进度线

此处 lineDashPattern 是长度对比,一长一短线,我使用的是两个数据,多个的话,暂时没弄明白,有大佬了解的留个言,
建议:此处进度最好和你自己进度比率相同,要不然会出现上图的情况(一线两色)

///背景线
private lazy var backLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.fillcolor = UIcolor.clear.cgcolor
    layer.strokecolor = .green.cgcolor
    layer.linewidth = 2
    layer.lineDashPattern = [15, 3]
    layer.path = path.cgPath
    return layer
}()
///进度条线
private lazy var progressLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.fillcolor = UIcolor.clear.cgcolor
    layer.strokecolor = .red.cgcolor
    layer.linewidth = 2
    layer.lineDashPattern = [15, 3]
    layer.strokeStart = 0
    layer.strokeEnd = 0
    layer.path = path.cgPath
    return layer
}()

1.3 添加到视图上

直接设置 progressLayer.strokeEnd = progress 会显得突兀,我再此添加一个动画
后续此处就不一一说明

///数据
layer.addSublayer(backLayer)
layer.addSublayer(progressLayer)

///进度
public var progress: CGfloat = 0.0 {
    dIDSet {
        CATransaction.begin()
        CATransaction.setdisableActions(false)
        CATransaction.setAnimationTimingFunction(camediatimingFunction(name: .linear))
        CATransaction.setAnimationDuration(2)
        progressLayer.strokeEnd = progress
        CATransaction.commit()
    }
}

2 普通圆形进度条

@H_821_502@

2.1首先开放公共参数

///背景颜色
public var backcolor: UIcolor = .gray
///进度条颜色
public var progresscolor: UIcolor = .red
///线宽
public var linewidth: CGfloat = 2.0  
///圆直径
public var realWIDth: CGfloat = 100
///圆起点角度。角度从水平右侧开始为0,顺时针为增加角度。直接传度数 如-90
public var startAngle: CGfloat = 0.5 * .pi
///圆结束角度。角度从水平右侧开始为0,顺时针为增加角度。直接传度数 如-90
public var endAngle: CGfloat = 0.5 * .pi
///动画时长
public var duration: CGfloat = 2

2.2 使用贝赛尔曲线画圆

设置中心点、半径(通过直径 - 宽度计算得来)、起始位置,结束位置

let radius = realWIDth / 2 - linewidth

///贝塞尔直线
private lazy var path: UIBezIErPath = {
    let bezIErPath = UIBezIErPath(arcCenter: CGPoint(x: realWIDth/2, y: realWIDth/2),
                                  radius: radius,
                                  startAngle: startAngle,
                                  endAngle: 2 * .pi + endAngle,
                                  clockwise: true)
    return bezIErPath
}()

2.2 使用CAShapeLayer初始化底部背景线,和进度线

然后 添加到视图,和设置进度我就不说了,上面都有, 至于是多少角度的圆形,设置起始角度和结束角度就可以了

///背景圆环
private lazy var backLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.frame         = bounds
    layer.fillcolor     = UIcolor.clear.cgcolor
    layer.linewidth     = linewidth
    layer.strokecolor   = backcolor.cgcolor
    layer.lineCap       = .round
    layer.path          = path.cgPath
    return layer
}()

///进度圆环
private lazy var progressLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.frame         = bounds
    layer.fillcolor     = UIcolor.clear.cgcolor
    layer.linewidth     = linewidth
    layer.strokecolor   = progresscolor.cgcolor
    layer.lineCap       = .round
    layer.path          = path.cgPath
    layer.strokeEnd     = 0
    return layer
}()

3 绘制渐变进度条

在这里插入图片描述

3.1首先开放渐变公共参数

相同参数我就不在一一叙述

///渐变颜色
public var colors: [CGcolor] = [UIcolor.red.cgcolor, UIcolor.green.cgcolor]
///渐变色位置
public var locations: [NSNumber] = [0, 1]
///渐变色起始位置
public var startPoint: CGPoint = CGPoint(x: 0, y: 0)
///渐变色结束位置
public var endPoint: CGPoint = CGPoint(x: 1, y: 0)

3.2 使用CAGradIEntLayer设置渐变背景

///渐变背景
private lazy var gradIEntLayer: CAGradIEntLayer = {
    let layer = CAGradIEntLayer()
    layer.frame = bounds
    layer.colors =  colors
    layer.locations =  locations
    layer.startPoint =  startPoint
    layer.endPoint =  endPoint
    return layer
}()

3.3 把进度圆环放到渐变背景上

然后加载进度就可以了

gradIEntLayer.mask = progressLayer
layer.addSublayer(gradIEntLayer)

4 在进度条终点添加样式

在这里插入图片描述

4.1 添加终点样式

此处我使用了 UIVIEw,你可以采用图片渐变 vIEw 等
在 layer.addSublayer(progressLayer) 后面放入,

addSubvIEw(dot)
dot.isHIDden = true

4.2 跟谁进度条速度加载

使用 CAAnimation 加载动画
整圆和非整圆这块加载我没给弄清楚,有了解的大佬请给予指出,虽然结果没错,但是两套逻辑总感觉很奇怪

private lazy var pointAnimation: CAAnimation = {
    let animation = CAKeyframeAnimation(keyPath: "position")
    animation.timingFunction = camediatimingFunction(name: .linear)
    animation.fillMode = .forwards
    animation.calculationMode = CAAnimationcalculationMode.paced
    animation.isRemovedOnCompletion = false
    animation.duration = duration
    ///此处记得加载代理,不用执行方法
    animation.delegate = self
    
    var end = 2 * .pi * progress + startAngle
    ///非整圆
    if data.startAngle != data.endAngle {
        end = (2 * .pi - CGfloat(fabs(Double(endAngle))) - startAngle) * progress + startAngle
    }
    
    let imagePath = UIBezIErPath(arcCenter: CGPoint(x: realWIDth/2,
                                 radius: radius,
                                 startAngle: startAngle,
                                 endAngle: end,
                                 clockwise: true)
    animation.path = imagePath.cgPath
    return animation
}()

执行加载动画,此处跟谁到 progress 设置进度后面即可

dot.isHIDden = false
dot.layer.add(pointAnimation,forKey: "pointAnimation")

5 仪表盘进度条样式

在这里插入图片描述

5.1 公开参数

此处总长度是圆周长长度,这个切记要计算好,否则最后一根线会有问题

///线间距 间断进度条专属  直线计算长度,圆计算周长
public var lineDashPattern: [NSNumber] = [15 , 5]

5.2 初始化贝塞尔曲线,CAShapeLayer背景和进度条

///贝塞尔直线
private lazy var path: UIBezIErPath = {
    let bezIErPath = UIBezIErPath(arcCenter: CGPoint(x: data.realWIDth / 2, y: data.realWIDth / 2),
                                  clockwise: true)
        
    return bezIErPath
}()
///背景
private lazy var backLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.frame         = bounds
    layer.fillcolor     = UIcolor.clear.cgcolor
    layer.linewidth     = linewidth
    layer.strokecolor   = backcolor.cgcolor
    layer.path          = cgPath
    layer.lineDashPattern = lineDashPattern
    
    return layer
}()
///进度条
private lazy var progressLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.frame         = bounds
    layer.fillcolor     = UIcolor.clear.cgcolor
    layer.linewidth     = linewidth
    layer.strokecolor   = progresscolor.cgcolor
    layer.path          = path.cgPath
    layer.strokeEnd     = 0
    layer.lineDashPattern = lineDashPattern
    
    return layer
}() 

添加设置进度和之前一样,我就不一一赘述

下面就说些我封装的进度条使用方法

封装的demo中有案例
1、通过设置 type 类型,添加各种类型的进度条

let newVIEw = HJProgress(frame: CGRect(x: 10, y: 110, wIDth: 120, height: 120))
newVIEw.type = .circle

2、通过设置HJData() 设置各种参数添加数据之后,才会出现进度条

var data = HJData()
data.realWIDth = 120
data.linewidth = 2
newVIEw.data = data

3、通过设置progress 加载进度条

demo 传送门

具体例子看我下面 github 的 demo 吧,欢迎来提建议
demo

CSDN 上ZIP 压缩包(免积分)
HJProgress

总结

以上是编程之家为你收集整理的Swift 圆形进度条全部内容,希望文章能够帮你解决Swift 圆形进度条所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

Swift文章

demo 传送门demo效果图前言ios 10.0因为 UI 做了一些很别致的进度条效果图,而且在网上又找不到合适的三方库,自己在网上查查资料做了出来,然后整理了一下,分享给大家使用首先,这个东西只是用贝赛尔曲线做出来的,并不是很难,做出来只是略微麻烦一点,网上也有很多资料,不过并不是很多,所以我就整理了一下,一是整理备份一下记录,二是分享给大家看下1、绘制这个断断续续的进度条UI 设计很漂亮,但是由于数据过多或过少,导致太难看,最后放弃1.1 初始化一个贝塞尔直线///贝塞尔直线
xcode13正式版已经更新,这是Mac平台上一款专业的开发工具,Xcode 13 for Mac添加了强大的新团队开发功能,非常适合与Xcode云以及GitHub、Bitbucket和GitLab协作功能,你还能在Xcode中直接发起、审查、评论和合并拉取请求,这次的xcode mac版功能更加完善,欢迎各位来体验哦!Xcode 13 for Mac官方介绍Xcode 包含开发人员为 Mac、iPhone、iPad、Apple TV 和 Apple Watch 创建出色应用程序所需的一切。Xc
swift是完全无中心架构,采用一致性哈希算法获得数据的位置。本文简要总结swift存储的整体架构和关键技术,进一步了解不同分布式存储技术实现原因上的差异。
实现思路:1)设置cell的高度为自动计算:UITableView.automaticDimension2)为cell内部的view控件添加上下约束如图所示,当cell高度自动计算,且约束添加成功时,cell竖直方向被撑满,这样cell的高度就会随着view控件的高度变化了 。实现步骤:步骤一(自定义tableViewCell,设置约束!!!这里只使用一个label标题和一个textView模拟):创建TableViewControllerCell.swift文件,并添加如下
前言xcode 13.3iOS 15.4TextField 明文显示的输入框文字输入框,相当于OC的UITextFieldTextFieldStyleTextField 有自己的风格,给我们提供了一些选项:1、PlainTextFieldStyle:.textFieldStyle(.plain)A text field style with no decoration.没有装饰的文本字段样式。2、DefaultTextFieldStyle: TextField 的默认样式,在 i
一 开发工具版本:01 iOS 开发工具版本Xcode Version 13.3 (13E113)02 iOS项目开发语言为Swift4.203 Unity开发工具版本 2019.4.16f1c1二 新建一个iOS项目和Unity项目01 iOS新建一个Swift语言的项目。在新建的iOS工程里,新建文件夹Unity_Framework_Project,后续unity导出的工程放到这个文件夹里02 Unity项目里,切到iOS平台Unity将程序包导出,放入iOS工程里的文件夹
1、闭包的概念闭包是可以在代码中被传递和引用的功能性独立代码块,跟C和Objective-C中的代码块(blocks)和其他一些语言中的匿名函数相似闭包可以作为函数的参数也可以作为函数的返回值可以像oc中用于回调和反向传值闭包能够捕获和存储定义在其上下文中的任何常量和变量的引用全局和内嵌函数,实际上是特殊的闭包。闭包符合如下三种形式中的一种:全局函数是一个有名字但不会捕获任何值的闭包内嵌函数是一个有名字且能从其上层函数捕获值的闭包闭包表达式是一个轻量级语法所写的可以捕获其上下文中常量或
Image 图片在SwiftUI中, 使用 Image 渲染图片, Image 可以加载 资源包, 系统图标, UIImage 等图片资源.基本用法1.从资源包内加载图片Image("cat")2.加载UIImage图片Image(uiImage: UIImage(named: "dog")!)3.加载苹果的 SF Symbols IconImage(systemName: "cloud.heavyrain.fill") .font(.largeTitle)属性设置内容显示
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注