从cgpoint开始仅在一个方向上绘制线

如何解决从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
      }
    

以及touchesEndtouchesCancell中的firstPt = nil

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?