【发布时间】:2018-04-26 03:14:08
【问题描述】:
我正在为一个应用程序创建一些自定义按钮,有几个图标,我在理论上都设计了它们,但我无法弄清楚如何在 iOS 中绘制这个讨厌的“复选框”图标UIBezierPath 语言。
作为一般规则,图标的边界是 5 x 5,图标内包含的图形的边界是 3 x 3。(是的,我知道复选框突出在 3 x 3 边界之外)。
这里有一个复选框图标和一个“加号”图标(是的,我使用 Corel DRAW 12 打球,那又怎样...):
你看,“加号”图标,我可以这样做没有问题:
class BezierPathFactory {
// "gridSpacing" is expected to be the containing view's width / 5
static func plus(gridSpacing G: CGFloat) -> UIBezierPath {
let path = UIBezierPath()
let startPoint = CGPoint(x:2*G,y:G)
path.move(to: startPoint)
path.addLine(to: CGPoint(x:2*G,y:2*G))
path.addLine(to: CGPoint(x:G,y:2*G))
path.addLine(to: CGPoint(x:G,y:3*G))
path.addLine(to: CGPoint(x:2*G,y:3*G))
path.addLine(to: CGPoint(x:2*G,y:4*G))
path.addLine(to: CGPoint(x:3*G,y:4*G))
path.addLine(to: CGPoint(x:3*G,y:3*G))
path.addLine(to: CGPoint(x:4*G,y:3*G))
path.addLine(to: CGPoint(x:4*G,y:2*G))
path.addLine(to: CGPoint(x:3*G,y:2*G))
path.addLine(to: CGPoint(x:3*G,y:G))
path.addLine(to: startPoint)
path.close()
return path
}
// ...
}
但是,复选框图标让我很头疼。
到目前为止,我已经确定了以下几点:
对勾的长宽比(顺时针旋转45度)为4:2
勾号右上角的CGPoint与“inside (3 x 3) box”的右上角相同
-
如果图标的网格间距为 1,那么从 45 度的角度来看,复选标记的每个“块”都是 (sqrt(18) / 5) 高和/或宽。
家里有数学家吗?
我仍在努力,但请随时尝试。
这是我目前所拥有的:
static func checkMark(gridSpacing G: CGFloat) -> UIBezierPath {
let blurp = UIBezierPath()
let CM_hyp = sqrt((18*G)/5)
let CM_opp_or_adj = sqrt( ((CM_hyp)*(CM_hyp)) / 2 )
let startPoint = CGPoint(x: 4*G, y: G)
blurp.move(to: startPoint)
blurp.addLine(to: CGPoint(x: (4*G)+CM_opp_or_adj, y: G + CM_opp_or_adj))
blurp.addLine(to: CGPoint(x: 4*G-(3*CM_opp_or_adj), y: 4*G) )
blurp.addLine(to: CGPoint( x: G, y:(4*G) - 2*CM_opp_or_adj ))
blurp.addLine(to: CGPoint( x: G + CM_opp_or_adj, y: (2*G) + CM_opp_or_adj) )
//6
blurp.addLine(to: CGPoint( x: 2*G + CM_opp_or_adj, y: (4*G) - 2*CM_opp_or_adj ) )
blurp.addLine(to: startPoint)
blurp.close()
return blurp
}
但它看起来很傻。我做错了什么。
【问题讨论】:
-
我认为你可以只添加 2 条 90 度弧线并增加宽度而不是绘制......一切?
-
否定!!!! :)
-
我推荐PaintCode
-
我会画一个向后的 L 并旋转它。这不是我们刚刚在你的另一个问题中学到的吗???
-
PaintCode 是最好的,但如果你想手动完成,我会使用 0,0 -> 1,1 的比例,所以点可以缩放到任何大小,但你可以做简单的数学运算从光栅图形。假设一个点在 100x100 图像中的 43,33,所以你添加一个点 @ (width *.43, height * .33)
标签: ios swift math geometry uibezierpath