绘制采用核芯显卡

问题描述:

我想让用户绘制一个矩形上UIImageView 我加了两个变量为先的最后触摸位置 我添加了这个功能上的UIImageView矩形: -绘制采用核芯显卡

func draw(from: CGPoint, to: CGPoint) { 
    UIGraphicsBeginImageContext(imageView.frame.size) 
    context = UIGraphicsGetCurrentContext() 
    context?.setStrokeColor(UIColor(red: 0, green: 0, blue: 0, alpha: 1.0).cgColor) 
    context?.setLineWidth(5.0) 
    let currentRect = CGRect(x: from.x, 
          y: from.y, 
          width: to.x - from.x, 
          height: to.y - from.y) 
    context?.addRect(currentRect) 
    context?.drawPath(using: .stroke) 
    context?.strokePath() 
    imageView.image?.draw(in: self.imageView.frame) 
    imageView.image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
} 

我添加该方法(touchMoved)它吸引许多矩形

我的方法添加到(touchEnded)它绘制一个,但是当用户移动触摸它不会出现

screenshot

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     firstTouchLocation = touch.location(in: self.view)    
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     lastTouchLocation = touch.location(in: self.view) 
     draw(from: firstTouchLocation, to: lastTouchLocation) 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     lastTouchLocation = touch.location(in: self.view) 
     draw(from: firstTouchLocation, to: lastTouchLocation) 
    } 
} 

我希望让用户扩展矩形时touchMoved并绘制touchEnded时。

您正在用以前的image加上一个矩形绘制的新图像替换您的image。不是从图像视图中绘制图像,而是绘制原始图像。

或者,可以使矩形的形状图层,只是更新形状图层的路径:

class ViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 

    private let shapeLayer: CAShapeLayer = { 
     let _shapeLayer = CAShapeLayer() 
     _shapeLayer.fillColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0).cgColor 
     _shapeLayer.strokeColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1).cgColor 
     _shapeLayer.lineWidth = 3 
     return _shapeLayer 
    }() 

    private var startPoint: CGPoint! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     imageView.layer.addSublayer(shapeLayer) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     startPoint = touches.first?.location(in: imageView) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     guard let startPoint = startPoint, let touch = touches.first else { return } 

     let point: CGPoint 

     if let predictedTouch = event?.predictedTouches(for: touch)?.last { 
      point = predictedTouch.location(in: imageView) 
     } else { 
      point = touch.location(in: imageView) 
     } 

     updatePath(from: startPoint, to: point) 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     guard let startPoint = startPoint, let touch = touches.first else { return } 

     let point = touch.location(in: imageView) 

     updatePath(from: startPoint, to: point) 
     imageView.image = imageView.snapshot(afterScreenUpdates: true) 
     shapeLayer.path = nil 
    } 

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
     shapeLayer.path = nil 
    } 

    private func updatePath(from startPoint: CGPoint, to point: CGPoint) { 
     let size = CGSize(width: point.x - startPoint.x, height: point.y - startPoint.y) 
     let rect = CGRect(origin: startPoint, size: size) 
     shapeLayer.path = UIBezierPath(rect: rect).cgPath 
    } 

} 

其中:

extension UIView { 
    func snapshot(afterScreenUpdates: Bool = false) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 
     drawHierarchy(in: bounds, afterScreenUpdates: afterScreenUpdates) 
     let image = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

这不仅是简单的,但更有效,太。

国债收益率:

enter image description here

顺便说一句,我可能会建议在touchesMoved使用预测触动。在一个设备上(而不是在模拟器),可以产生一个稍微更响应的用户界面。

+0

在哪里我可以找到关于“预测性触摸”的信息,您知道我可以在哪里找到一些教程或somethig? –

+1

@ReinierMelian - 参见WWDC 2015 [iOS上的高级触摸输入](https://developer.apple.com/videos/play/wwdc2015/233/)。或者只是谷歌“预测教程”,你会看到很多链接。 – Rob

+0

非常感谢。但它绘制了一个矩形,并且当一个新的touchBegan事件开始一个新的矩形并删除了前一个。我想在触摸结束后保存图形并开始新的绘图。 –