UIBezierPath 不是到处都一样胖而且被切断
UIBezierPath not equally fat everywhere and cut off
我正在尝试绘制一条直线,其末端附有一条光滑的二次曲线。因此,我正在使用此代码:
import Foundation
import UIKit
class IndicatingView: UIView {
var path: UIBezierPath!
override init(frame: CGRect) {
super.init(frame: frame)
}
func createLineWithCurve() {
path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 0, y: self.frame.height - self.frame.width))
path.addQuadCurve(to: CGPoint(x: self.frame.width, y: self.frame.height), controlPoint: CGPoint(x: 0, y: self.frame.height))
}
override func draw(_ rect: CGRect) {
self.createLineWithCurve()
path.lineWidth = 3
// Specify a border (stroke) color.
UIColor.purple.setStroke()
path.stroke()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我得到的输出看起来已经很不错了:
但是,正如您所看到的,四线曲线比正常线更胖。此外,四边形曲线似乎在底部被切断。我该如何解决?我希望路径是完全平滑的,而不是在某些点看起来更胖或以某种方式被切断。
提前感谢您的帮助:)
在这里你可以看到我的 "result" -> 我把线宽调大了一点,你可以看到,它画得很完美;)
Apple 总是在点上绘制,所以如果你在点 0,0 上画一条宽度为 3 的线,一个点是 -1,0,一个在 0,0 上,一个在 1,0 上
问题是您的路径被视图的边界截断了。例如,在从 0, 0
开始的垂直笔划中,路径的一半垂直笔划将落在视图的左边缘之外。
您应该使用insetBy(dx:dy:)
将描边路径插入线宽的一半,这将确保整个描边都落在视图的bounds
范围内。然后使用结果插图 CGRect
的 minX
、maxX
等来计算您的路径的各种 CGPoint
。
例如:
class IndicatingView: UIView {
func lineWithCurve() -> UIBezierPath {
let lineWidth: CGFloat = 3
let rect = bounds.insetBy(dx: lineWidth / 2, dy: lineWidth / 2)
let path = UIBezierPath()
path.lineWidth = lineWidth
path.lineCapStyle = .square
path.move(to: CGPoint(x: rect.minX, y: rect.minY))
path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY - rect.width))
path.addQuadCurve(to: CGPoint(x: rect.maxX, y: rect.maxY), controlPoint: CGPoint(x: rect.minX, y: rect.maxY))
return path
}
override func draw(_ rect: CGRect) {
UIColor.purple.setStroke()
lineWithCurve().stroke()
}
}
产生:
我正在尝试绘制一条直线,其末端附有一条光滑的二次曲线。因此,我正在使用此代码:
import Foundation
import UIKit
class IndicatingView: UIView {
var path: UIBezierPath!
override init(frame: CGRect) {
super.init(frame: frame)
}
func createLineWithCurve() {
path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: 0, y: self.frame.height - self.frame.width))
path.addQuadCurve(to: CGPoint(x: self.frame.width, y: self.frame.height), controlPoint: CGPoint(x: 0, y: self.frame.height))
}
override func draw(_ rect: CGRect) {
self.createLineWithCurve()
path.lineWidth = 3
// Specify a border (stroke) color.
UIColor.purple.setStroke()
path.stroke()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我得到的输出看起来已经很不错了:
但是,正如您所看到的,四线曲线比正常线更胖。此外,四边形曲线似乎在底部被切断。我该如何解决?我希望路径是完全平滑的,而不是在某些点看起来更胖或以某种方式被切断。
提前感谢您的帮助:)
在这里你可以看到我的 "result" -> 我把线宽调大了一点,你可以看到,它画得很完美;)
Apple 总是在点上绘制,所以如果你在点 0,0 上画一条宽度为 3 的线,一个点是 -1,0,一个在 0,0 上,一个在 1,0 上
问题是您的路径被视图的边界截断了。例如,在从 0, 0
开始的垂直笔划中,路径的一半垂直笔划将落在视图的左边缘之外。
您应该使用insetBy(dx:dy:)
将描边路径插入线宽的一半,这将确保整个描边都落在视图的bounds
范围内。然后使用结果插图 CGRect
的 minX
、maxX
等来计算您的路径的各种 CGPoint
。
例如:
class IndicatingView: UIView {
func lineWithCurve() -> UIBezierPath {
let lineWidth: CGFloat = 3
let rect = bounds.insetBy(dx: lineWidth / 2, dy: lineWidth / 2)
let path = UIBezierPath()
path.lineWidth = lineWidth
path.lineCapStyle = .square
path.move(to: CGPoint(x: rect.minX, y: rect.minY))
path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY - rect.width))
path.addQuadCurve(to: CGPoint(x: rect.maxX, y: rect.maxY), controlPoint: CGPoint(x: rect.minX, y: rect.maxY))
return path
}
override func draw(_ rect: CGRect) {
UIColor.purple.setStroke()
lineWithCurve().stroke()
}
}
产生: