линия расходится при касании конца при рисовании линии

#swift #cgpoint #cgpath #uigraphicscontext #touchesended

#swift #cgpoint #cgpath #uigraphicscontext #touchesended

Вопрос:

Моя цель swift-кода — просто рисовать линии на изображении. Прямо сейчас, когда вы поднимаете руку от изображения, рисунок исчезает. Когда ваша рука нажата, она работает только тогда, когда ваша рука или точка отпущены, ничего не сохраняется. Я не знаю, чего мне не хватает в моем коде, чтобы исправить это, это может быть только одна строка.

 import UIKit
class ViewController: UIViewController {
    
    var statPoint = CGPoint.zero
    var swipe = false
    var pic = UIImageView()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        pic.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(pic)
        pic.backgroundColor = .brown
        view.backgroundColor = .cyan
        pic.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else {
            return}
        
        swipe = false
        statPoint = touch.location(in: view)
    }
    
    func drawLine(from fromPoint: CGPoint, to toPoint : CGPoint)  {
        UIGraphicsBeginImageContext( view.frame.size)
        
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        
        pic.image?.draw(in: view.bounds)
        context.move(to: fromPoint)
        context.addLine(to: toPoint)
        context.setLineCap(.round)
        context.setLineWidth(5)
        context.setBlendMode(.normal)
        context.setStrokeColor(UIColor.black.cgColor)
        context.strokePath()
        pic.image = UIGraphicsGetImageFromCurrentImageContext()
        pic.alpha = 1
        
        UIGraphicsEndImageContext()
        
        
        
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else {
            return
            
        }
        swipe = true
        let currentPoint = touch.location(in: view)
        drawLine(from: statPoint, to: currentPoint)
        statPoint = currentPoint
    }
    
    
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if !swipe {
            drawLine(from: statPoint, to: statPoint)
        }
        
        UIGraphicsBeginImageContext(pic.frame.size)
        pic.image?.draw(in: view.bounds, blendMode: .normal, alpha: 1)
        pic.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    }
}
 

Ответ №1:

Я проверил ваш код. Я думаю, что проблема связана с фреймом, который вы используете в touchedEnded.

Замените ваш touchedEnded на приведенный ниже код

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
   if !swipe {
       drawLine(from: statPoint, to: statPoint)
   }
       
   UIGraphicsBeginImageContext(view.frame.size)
   pic.image?.draw(in: view.bounds, blendMode: .normal, alpha: 1)
   pic.image = UIGraphicsGetImageFromCurrentImageContext()
   UIGraphicsEndImageContext()
}