如何解决从cgpoint开始仅在一个方向上绘制线
我下面的swift代码目标是能够画一条直线。触摸uiview时,用户只能在初始点上方绘制90度。方向已经确定。因此,用户可以在所触摸的点上方画线。您可以在左侧行下方的gif代码中执行以下操作。右边的线是我要达到的目标。
https://github.com/silverstripe/silverstripe-blog
import UIKit
class ViewController: UIViewController{
var draw = Canvas()
override func viewDidLoad() {
super.viewDidLoad()
[draw].forEach {
view.addSubview($0)
$0.translatesAutoresizingMaskIntoConstraints = false}
}
override func viewDidLayoutSubviews() {
draw.backgroundColor = .clear
NSLayoutConstraint.activate ([
draw.bottomAnchor.constraint(equalTo: view.bottomAnchor),draw.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.77,constant: 0),draw.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1,draw.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant : 0),])
}
}
struct ColoredLine {
var color = UIColor.black
var points = [CGPoint]()
var width = 5
}
class Canvas: UIView {
var strokeColor = UIColor.red
var strokeWidth = 5
func undo() {
_ = lines.popLast()
setNeedsdisplay()
}
func clear() {
lines.removeAll()
setNeedsdisplay()
}
var lines = [ColoredLine]()
override func draw(_ rect: CGRect) {
super.draw(rect)
guard let context = UIGraphicsGetCurrentContext() else { return }
lines.forEach { (line) in
for (i,p) in line.points.enumerated() {
if i == 0 {
context.move(to: p)
} else {
context.addLine(to: p)
}
}
context.setstrokeColor(line.color.cgColor)
context.setlinewidth(CGFloat(line.width))
context.strokePath()
context.beginPath()
}
}
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
var coloredLine = ColoredLine()
coloredLine.color = strokeColor
coloredLine.width = strokeWidth
lines.append(coloredLine)
}
override func touchesMoved(_ touches: Set<UITouch>,with event: UIEvent?) {
guard let point = touches.first?.location(in: self) else { return }
guard var lastLine = lines.popLast() else { return }
lastLine.points.append(point)
lines.append(lastLine)
setNeedsdisplay()
}
}
解决方法
可以制造坐标,点由x和y组成。
保持y,并完成。
-
保持一个触摸事件的第一点
var firstPt: CGPoint? // get the first point override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) { guard let first = touches.first?.location(in: self) else { return } // store first as property firstPt = first }
-
制造剩余点,新的获取点的x不相关
override func touchesMoved(_ touches: Set<UITouch>,with event: UIEvent?) { guard let point = touches.first?.location(in: self),let first = firstPt else { return } let pointNeeded = CGPoint(x: first.x,y: point.y) // ...,do as usual }
以及touchesEnd
和touchesCancell
中的firstPt = nil
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。