iOS自定义组件-扇形进度视图

2023-05-16

iOS自定义组件-扇形进度视图

 

前言:

平时候我们在用Apple设备下载App的时候,就会看见扇形的进度,为了增强更好的用户体验,本人心血来潮写了个自定义组件-扇形进度视图,废话不多说,开始介绍,具体API使用请访问Github:

https://github.com/sulioppa/UISectorProgressView.git

 

1.需求:

(1)根据使用者提供的进度值来显示扇形进度。

(2)当组件的进度值改变时,自行重绘。

(3)有一定的容错、报错能力。

2.依据需求提出的问题:

(1)通过什么媒介作为进度值?

(2)如何根据进度值的改变而重绘?

(3)进度值在什么范围合适?

3.依据需求产生的问题提供的解决方案:

(1)NSNumber

(2)键值监听(KVO)

(3)[0,1],小于0抛异常,大于1不重绘。

4.具体流程:

(1)创建一个类叫做UISectorProgressView,继承UIView

(2)为该类声明一个属性,NSNumber类型的。

(3)为该类声明可见的initWithFrame方法和startWithProgress方法。

 

(4)编写UISectorProgressView.m中的方法。

1)首先对类进行扩展。

 

定义宏,具体的解释在drawRect方法里会解释。

用户可以设置填充颜色的RGB(0~255)和透明度。

StartAngle和point是后面会用到的变量,避免重复的压栈出栈。

  2)重写initWithFrame函数。

 

初始化组件的frame中的height,本人强制地让其等于其width.

并且对NSNumber类型的progress进行了初始化并对其进行了监听,默认颜色是黑色,不透明。

3)使用者需要调的函数。

 

如果传入的进度值是空,回报异常。

进度值越界,会报异常。

4)绘图函数

 

首先获取到画图要用的画笔。

如果值大于1或小于0的话,效果上表现的不重绘。

关于定义路径的知识:

CGContextAddArc是定义一段圆弧,第1个参数是画笔,2、3参数是圆心,本人默认为视图的中间,第4个参数是半径,本人也默认是视图一半的宽度,第5、6参数是开始角度和结束角度,第7个参数是表示是否逆时针。

在这里,逻辑上的坐标系和我们数学中的直角坐标系一样,3点钟方向是x正轴,12点方向是y正轴,角度是以距离x轴顺时针定义的,即:

 

一般iOS App的扇形进度以Y正轴为结尾,总是顺时针地减少剩余进度。

因此,所有的扇形均是以1.5π为结束角度,所以定义宏EndAngle为结束角度。

当进度值是0的时候,我们需要StartAngle=-0.5π。

当进度值是.25π的时候,我们需要StartAngle=0。

因此推断startAngle=2π*进度值-0.25π,所以定义了M_2PI和OffsetAngle。

经过这样一个函数我们就能定义了一个圆弧,包含开始点和结束点。

然后我们从结束点往圆心加一条线,最后封闭路径(系统为我们从圆心往开始点再引一条线),就构成了扇形进度。设置一下填充颜色、然后就可以画图了。

5)键值监听

 

对值进行区间判断。

在值改变了之后需要加至主队列,测试的时候是发现setNeedsDisplay是另开线程去做的,所以加入主线程可以及时的看到效果。

 

视图声明结束时取消监听。

6)Demo介绍

 

初始化一个UISectorProgressView的实例,位置和宽度自己定义,然后设置一下初始进度值进行进度显示。

7)进度控制

 

给按钮绑了个事件。

1s内更新10次。

效果如下图:

 

5.总结

学了一下绘图、KVO,了解到setNeedsDisplay是另开线程(可能是个队列,任务多的话短期内只做最后一次)去做。

以后的项目如果有需要的话就可以导入这个视图,方便的进行使用了。

 

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

iOS自定义组件-扇形进度视图 的相关文章

  • reloadData 调用 numberOfSections、numberOfRows,而不是 cellForRowAtIndexPath

    首先 如果格式不正确 我很抱歉 这是第一次这样做 我已经使用 stackoverflow 来寻求帮助很长时间了 它非常有帮助 谢谢大家 但这是我第一次发布自己的问题 这个问题已经被问过很多次了 但是当我调用 myTable reloadTa
  • Swift:在标签背景中制作图像

    我想将标签放入带有角半径的红色矩形的图像中 条件是图像大小必须等于或略大于标签大小 为此我找到了一个类似的question https stackoverflow com questions 3037902 adding backgroun
  • 删除 UISearchBar 中的清除按钮

    我想从 UISearchBar 中删除清除按钮 灰色 x 我尝试按照中的描述进行操作这个答案 https stackoverflow com a 19458201 但它不起作用 我将 Objective C 代码从下面的答案和评论翻译为以下
  • 如何获取 iTunes connect 团队 ID 和团队名称?

    我正在写下一个Appfile for fastlane 我的问题是我已经有了team name and team id在 Apple 开发中心 但我无法获取iTunes Connect ID itc team id 我正在与不同的团队合作
  • 在 Grand Central Dispatch 中使用dispatch_sync

    任何人都可以用非常清晰的用例解释其目的是什么dispatch sync in GCD是为了 我不明白在哪里以及为什么我必须使用它 Thanks 当您想要执行一个块并等待结果时可以使用它 其中一个示例是使用调度队列而不是锁进行同步的模式 例如
  • AVAssetExportSession.requestExportSession 回调从未被调用(swift 3,iOS10)

    以下代码从不调用导出回调 导出会话创建得很好 我没有看到任何错误 也没有任何进展 CPU 为 0 我认为没有例外 状态为 1 进行中 进度为 0 错误为零 视频在画廊中播放 我可以成功获取视频的图像 我已将代码提取到单个 UIViewCon
  • Health 处理多个步骤源的方式与 HealthKit 不同——swift

    我的 Swift iOS 应用程序与 HealthKit 连接 向用户显示他们当天到目前为止已经走了多少步 在大多数情况下 这是成功的 当步数的唯一来源是 iPhone 内置计步器功能记录的步数时 一切正常 并且我的应用程序显示的步数与健康
  • 针对架构 armv7 的 iOS 链接器错误的 Google 转化跟踪

    我正在尝试将 iOS 版 Google 转化跟踪功能添加到我的 iPhone 应用程序中 该应用程序的基础 SDK 是 iOS6 该应用程序的有效架构是armv7 armv7s 该应用程序的 iOS 部署目标是 4 3 我正在使用最新的 x
  • 使用 NSXMLParser 在 Swift 中解析分层 XML

    我确实在以我实际可以使用的形式获取分层 XML 值时遇到问题 因此我们将不胜感激 我对 Swift 和 IOS 开发还很陌生 所以说实话我并不完全理解解析器 但我希望在这之后我能理解 下面是我尝试解析的示例 XML 它来自肥皂网络服务 连接
  • 为 CocoaPods 插件设置 Xcode

    我正在尝试设置终端 Xcode 以便正确工作Xcode CocoaPods 插件 https github com kattrali cocoapods xcode plugin 当我从插件运行集成 cocoapods 选项时 我收到一条消
  • UIButton 不响应 UITableViewCell 中的单击事件

    ios 中有一个黑暗巫术阻止我的按钮被点击 如果我不向 uitableviewcell 添加按钮 并且单击该按钮 则会触发该事件 但如果按钮在 uitableviewcell 中 它不会被触发 看起来表 我已经准备好了示例代码 如果你们可以
  • 所有 UI 前面的透明 UIImageView

    首次启动我的应用程序后 我想向用户展示一些教程 以解释我的应用程序的功能 所以我需要设置一个带有一些箭头和标签的透明 UIImageView 其中主 UI 更具体地说 tabbarcontroler 中的 navigationviewcon
  • 检测 SFSafariViewController 中的 URL 更改

    我有一个 SFSafariViewController 当用户点击我的应用程序中的链接时 它会打开 我需要检测 URL 何时更改 这样当它更改时 应用程序会显示警报 我们如何检测 SFSafariViewController 中的 URL
  • 如何像键盘一样呈现选择器视图?

    我希望当我按下按钮 就像键盘一样 时显示 UIPickerView 然后在用户点击屏幕上的任意位置时消失 我怎样才能做到这一点 谢谢 更多背景信息 我在 UITableViewCell 中有一个名为 Months 的 UITextField
  • 在 Interface Builder 中启用/禁用 NSLayoutConstraints

    NSLayoutConstraint in iOS 8 0 has a BOOL属性称为active这使得动态禁用 启用所述布局约束变得容易 要为视图控制器创建第二个布局集 然后我可以以编程方式启用 禁用它 通过IBOutletCollec
  • 如何让 iPhone 发出蜂鸣声?

    什么代码可以让我在 iPhone 上发出标准的蜂鸣声 好吧 这取决于您想要什么样的声音 以下是如何使用 AVFoundation 音频框架播放声音 import
  • 使用 Swift 创建 SKSpriteNode 子类

    我正在尝试创建作为 SKSpriteNode 子类的类 并且我想向其添加其他属性和函数 但在第一步中我遇到了错误 这是我的代码 import SpriteKit class Ball SKSpriteNode init super init
  • 获取 iOS Swift 中 UIViewController 的所有列表

    有没有办法获取 iOS Swift 项目中的所有 UIViewController 我想获取所有 UIViewController 的数组并检查特定的 UIViewController 是否存在 我必须找到项目中是否存在特定的 UIView
  • UIButton 图像调整大小/缩放以适合

    我有一个非常严重的问题 我不知道如何解决 我正在对 UIButtons 框架进行动画处理 当我对其进行动画处理时 我希望按钮中的图像缩放到与按钮相同的大小 它无需在我的 iPhone 模拟器上执行任何操作即可运行 但是当我在 iPad 模拟
  • 如何在 JSONKit 中 JSON 序列化 NSDate 字典

    我尝试使用 Jsonkit 和 Apple 的 JSON 序列化器 但没有成功 它不断破坏 geo 属性 该属性是 NSNumbers 的 nsarray Post p Post alloc init p uname mike p like

随机推荐

  • ffmpeg命令分析-b:v

    本系列 以 ffmpeg4 2 源码为准 xff0c 下载地址 xff1a 链接 xff1a 百度网盘 提取码 xff1a g3k8 本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的 a mp4下载链接 xff1a 百度网盘
  • 魔百和M401A刷入Armbian系统EMMC

    魔百和M401A刷入Armbian系统 准备工具 span class token number 1 span 电视盒子 U盘 键盘 显示器 HDMI线 span class token number 2 span armbian系统镜像包
  • SonarQube9社区版环境配置

    由于种种原因 xff0c 需要配置SonarQuber9社区版配置中心 xff0c 记录下配置搭建过程 本次部署环境 win10 43 SonatQube9 9 43 opjdk17 1 软件下载 SonarQube9 9社区版 https
  • 虚拟内存以及进程的虚拟内存分布(第六章)

    在早期的计算机中 xff0c 程序都是直接运行在物理内存上的 xff0c 意思是运行时访问的地址都是物理地址 xff0c 而这要求程序使用的内存空间不超过物理内存的大小 在现代计算机操作系统中 xff0c 为了提高CPU的利用率计算机同时运
  • PyCharm导入模块报No model named

    PyCharm导入模块报No model named 引言 在PyCharm中同目录下import其他模块 xff0c 出现No model named 的报错 xff0c 但实际可以运行的情况 这很可能是因为PyCharm并没有将当前文件
  • 推荐一款程序猿必备IDE软件 notepad++,很好用

    编程软件对于程序猿来说不仅仅是辅助 xff0c 更是效率 对于高手 大神级别的来说 xff0c 记事本就行 xff0c 可对于刚入门的 半吊子的程序猿来说 xff0c 还是软件爽 xff0c 上图为notepad 43 43 截图 这个软件
  • IOS文件管理

    IOS文件管理 1 沙盒机制 xff1a IOS应用程序只能对自己创建的文件系统读取文件 xff0c 这个独立 封闭 安全的空间就叫做沙盒 它可以存储程序包文件 xff08 可执行文件 xff09 图片 音频 视频 plist文件 sqli
  • 工作日记NO.2

    1 安装局域网内网通 xff1b 2 安装VS2017 43 AutoCAD 43 ObjectARX VS2017 43 AutoCAD2020配置ObjectARX VS2017 43 AutoCAD2020配置ObjectARX dg
  • objectARX CString未定义标识符与常用字符类型转换

    1 CString未定义标识符 CString并非是标准类型 xff0c 为MFC中定义的类型 xff1b 情况1 xff1a 创建了一个C 43 43 的动态链接库 xff0c 属性上已经选中了dll中支持MFC xff0c 仍报错CSt
  • Windows远程桌面访问Debian系统

    前几天闲着没事 xff0c 把笔记本系统由Windows10换成了Debian xff0c 下载Debian ISO镜像文件总共花了12 4G空间 xff08 debian 10 3 0 amd64 DVD 1 iso xff08 3 7G
  • Failed to build mpi4py ERROR: Could not build wheels for mpi4py, which is required to install pyproj

    最近在配置项目环境的时候 xff0c 使用pip install r requirements txt时总是报错 Building wheel for mpi4py pyproject toml error error subprocess
  • iOS上传语音到服务器

    iOS上传语音到服务器 这里介绍用AFN上传语音文件到服务端 如果不是NSData就要想办法把语音文件转化为NSData xff0c 然后才能上传服务器 首先我们拿到语音文件对应的NSData对象 NSData voiceData 61 m
  • 【CSS】弹性盒子 display:flex和justify-content:center和align-items:center一起使用的问题...

    CSS 弹性盒子 display xff1a flex和justify content xff1a center和align items xff1a center一起使用的问题 1 例子一 xff1a 搜索框 使用 lt view gt 和
  • Ubuntu 中安装ARM-qt4.8.5

    一 准备工作 xff1a ubuntu 系统 参考 VirtualBox中安装Ubuntu14 04 https blog csdn net u012166958 article details 80040082 二 下载qt和tslib
  • win10重装系统

    1 启动盘制作 准备8G U盘一个 xff0c 插入windows系统的电脑中 xff0c 格式化为ntfs格式 进入https www microsoft com zh cn software download windows10 点击
  • mock System.getenv()

    网上找的大多不好用 甚至有的答案说不能 本人不服 xff0c 试了一个晚上终于调试成功了 span class token annotation punctuation 64 RunWith span span class token pu
  • OpenCV——Anime4k代码

    新的实时漫画放大算法 立志于改善AV画质 至于更清晰的说明请搜索baidu 核心还是用到了8方向sobel核的思想 xff0c 在改善边缘的同时 xff0c 不造成振铃和过冲 代码运行设置参数请详细见官网说明 我的设置 xff1a 34 A
  • ming w64下载安装

    下载地址 xff1a https sourceforge net projects mingw w64 files 尽量不要使用install在线安装方式 xff0c 左侧的软件包下载 xff0c 解包 xff0c 加入环境变量即可使用
  • 笔记:免费SSL证书申请,Linux+Nginx启用https

    实操 xff1a 阿里云CentOS 7 4 xff0c Nginx版 获取SSL证书 域名控制台 gt 基本信息 gt 免费开启SSL证书 gt 单域名免费证书 下载Nginx证书信息 上传SSL证书 把 crt和 key文件上传至Lin
  • iOS自定义组件-扇形进度视图

    iOS自定义组件 扇形进度视图 前言 xff1a 平时候我们在用Apple设备下载App的时候 xff0c 就会看见扇形的进度 xff0c 为了增强更好的用户体验 xff0c 本人心血来潮写了个自定义组件 扇形进度视图 xff0c 废话不多