ios - 在半圆形 Swift/UIView 上绘制比例尺
问题描述
想象一下,我有一个从单位圆到 Pi 的完整半圆。左边有一个小数叫 min,右边有一个大数叫 max。根据某些因素,应用程序内部两者都可以互换。你们中有人对如何像我在下图中那样绘制比例有一个很好的想法吗?我希望每个 x mod 10 = 0 有更长的线,中间有三个更大的线。灰色圆圈仅用于定位。
所以我从以下代码开始:
let radius = CGFloat(40)
let dashLong = CGFloat(10)
let dashShort = CGFloat(5)
let middle = CGPoint(x: 50, y: 50)
let leftAngle = CGFloat(Double.pi)
let rightAngle = CGFloat(0)
let min = 45 //random num
let max = 117 //random num
let innerPath = UIBezierPath(arcCenter: middle, radius: radius, startAngle: rightAngle, endAngle: leftAngle, clockwise: true)
let middlePath = UIBezierPath(arcCenter: middle, radius: radius+dashShort, startAngle: rightAngle, endAngle: leftAngle, clockwise: true)
let outerPath = UIBezierPath(arcCenter: middle, radius: radius+dashLong, startAngle: rightAngle, endAngle: leftAngle, clockwise: true)
因此,刻度中有两种类型的破折号的半径和长度。我选择了 45 和 117 作为尺度极值的随机整数。我不需要绘制的三个路径只是破折号需要开始和结束的方向。因此,对于 50,60,...110,从 innerPath 开始并到达外部路径,我很确定它必须处于相同的角度才能在所有圆圈上划线。
有没有人有一个非常聪明的想法如何继续计算破折号并绘制它们而不会弄乱代码?
解决方案
我的建议是在 CALayer 中绘制这个半圆,并在不同的 CALayer 中从半圆的中心画线,然后将它们都遮住,这样它就看起来像这样
推荐阅读
- java - 如何使 android:textIsSelectable="true" 符合我的意图?
- python - 如何对列值(艺术家、曲目和日期)相同的多个行值(全部 float64)进行分组?
- vaadin - 如何动态添加弹簧视图
- git - Git 分支合并错误
- php - 在一个人无法完全控制的主机上安装 ffmpeg?+
- javascript - 如何在 Angular 7 for 循环中找到数组的第一项和最后一项?
- javascript - 如何调用多个弹出窗口?
- python - conda 无法与鱼壳一起正常工作
- javascript - 如何按值获取密钥?
- reactjs - 如何使我的 React 应用程序安全?到目前为止,我可以使用 React DOM 工具登录,我错过了什么?