[英]Draw straight line swift 4
也许是一个简单的问题。 我正在尝试制作一个可以绘制直线的应用程序:水平垂直线和对角线。 我也在尝试对这些线进行测量(还没有使这个工作..)
我已经修复了我可以画线但不能画直线的问题(例如没有尺子的铅笔在网上找不到任何文件来画直线)
import UIKit
import Foundation
class tekengedeelte: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var tekenview: UIView!
var path = UIBezierPath()
var startPoint = CGPoint()
var touchPoint = CGPoint()
var setSigImage: ((_ data: UIImage) -> ())?
var setcameraimage: ((_ data: UIImage) -> ())?
override func viewDidLoad() {
super.viewDidLoad()
tekenview.layer.shadowOpacity = 1
tekenview.layer.shadowRadius = 10
tekenview.layer.shadowOffset = CGSize(width: 1, height: 1)
tekenview.layer.shadowColor = UIColor.black.cgColor
//tekenview.layer.shadowPath = UIBezierPath(rect: tekenview.bounds).cgPath
tekenview.layer.shadowPath = CGPath(rect: tekenview.bounds, transform: nil)
tekenview.layer.shouldRasterize = true
tekenview.clipsToBounds = true
tekenview.isMultipleTouchEnabled = false
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
if let point = touch?.location(in: tekenview) {
startPoint = point
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
if let point = touch?.location(in: tekenview) {
touchPoint = point
}
path.move(to: startPoint)
path.addLine(to: touchPoint)
startPoint = touchPoint
draw()
}
func draw() {
let strokeLayer = CAShapeLayer()
strokeLayer.fillColor = UIColor.black.cgColor
strokeLayer.lineWidth = 5
strokeLayer.strokeColor = UIColor.black.cgColor
strokeLayer.path = path.cgPath
tekenview.layer.addSublayer(strokeLayer)
tekenview.setNeedsDisplay()
}
@IBAction func clearPressed(_ sender: UIButton) {
path.removeAllPoints()
tekenview.layer.sublayers = nil
tekenview.setNeedsDisplay()
}
@IBAction func setPressed(_ sender: UIButton) {
// Convert CanvasView to UIImage
let renderer = UIGraphicsImageRenderer(size: tekenview.bounds.size)
let image = renderer.image { ctx in
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
// Send image back to onboarding screen
setSigImage?(image)
// Rotate device back to portrait mode
//let appDelegate = UIApplication.shared.delegate as! AppDelegate
//appDelegate.r = .portrait
// Close modal window
dismiss(animated: true)
}
//foto maken
@IBAction func camera(_ sender: UIButton) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerController.SourceType.camera;
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
}
}
@IBAction func photolibraryaction(_ sender: UIButton) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) {
let imagepicker = UIImagePickerController()
imagepicker.delegate = self
imagepicker.sourceType = UIImagePickerController.SourceType.photoLibrary;
imagepicker.allowsEditing = true
self.present(imagepicker, animated: true, completion: nil)
}
}
}
正如Reinier Melian解释的那样,使用核心图形绘制直线。 触摸结束后,使用CGContext
绘制保存图像以在UIImageView中显示。
您需要保留当前context
直到线条绘制过程结束为止 ,之后,您需要保留当前图像并清除context
,再次绘制保存的图像,然后绘制新线条。 触摸结束时,调用“清理当前context
并保存当前图像”,然后再次开始新的线条绘制过程。
import UIKit
class ViewController2: UIViewController {
@IBOutlet weak var drawingPlace: UIImageView!
var startTouch : CGPoint?
var secondTouch : CGPoint?
var currentContext : CGContext?
var prevImage : UIImage?
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
startTouch = touch?.location(in: drawingPlace)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
secondTouch = touch.location(in: drawingPlace)
if(self.currentContext == nil){
UIGraphicsBeginImageContext(drawingPlace.frame.size)
self.currentContext = UIGraphicsGetCurrentContext()
}else{
self.currentContext?.clear(CGRect(x: 0, y: 0, width: drawingPlace.frame.width, height: drawingPlace.frame.height))
}
self.prevImage?.draw(in: self.drawingPlace.bounds)
let bezier = UIBezierPath()
bezier.move(to: startTouch!)
bezier.addLine(to: secondTouch!)
bezier.close()
UIColor.blue.set()
self.currentContext?.setLineWidth(4)
self.currentContext?.addPath(bezier.cgPath)
self.currentContext?.strokePath()
let img2 = self.currentContext?.makeImage()
drawingPlace.image = UIImage.init(cgImage: img2!)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
self.currentContext = nil
self.prevImage = self.drawingPlace.image
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.