Swift: Imagen La pérdida de relación de aspecto cuando la representación se inicia

votos
0

Estoy tratando de hacer una edición de imágenes VC para mi aplicación y me encontré con el problema anterior. Cada vez que comienzo a dibujar en mi imagen, la imagen podría deformar y luego perder la relación de aspecto.

Gif como tal:

introducir

Mi código completo como tal:

class DrawImageController: UIViewController {

    var canvasImageView: UIImageView = {
        let iv = UIImageView()
        iv.translatesAutoresizingMaskIntoConstraints = false
        iv.backgroundColor = .yellow
        iv.contentMode = .scaleAspectFit
        return iv
    }()

    var lastTouch = CGPoint.zero

    override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
    }

    func setupViews() {
        view.backgroundColor = .black

        view.addSubview(canvasImageView)

        canvasImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        canvasImageView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        canvasImageView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        canvasImageView.heightAnchor.constraint(equalToConstant: 300).isActive = true

        canvasImageView.image = UIImage(named: testImage)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let firstTouch = touches.first {
            lastTouch = firstTouch.location(in: canvasImageView)
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let firstTouch = touches.first {
            let touchLocation = firstTouch.location(in: canvasImageView)
            drawLine(from: lastTouch, to: touchLocation)
            lastTouch = touchLocation
        }
    }

    func drawLine(from: CGPoint, to: CGPoint) {
        UIGraphicsBeginImageContext(canvasImageView.frame.size)

        if let context = UIGraphicsGetCurrentContext() {
            canvasImageView.image?.draw(in: CGRect(x: 0, y: 0, width: canvasImageView.frame.size.width, height: canvasImageView.frame.size.height))

            context.move(to: from)
            context.addLine(to: to)

            context.setLineCap(.round)
            context.setLineWidth(5.0)
            context.setStrokeColor(UIColor.blue.cgColor)

            context.strokePath()

            let image = UIGraphicsGetImageFromCurrentImageContext()
            canvasImageView.image = image
            UIGraphicsEndImageContext()
        }          
    }
}

He adaptado mi método sorteo de varios tutoriales en youtube, github y SO. Aconsejaría a nadie dónde podría haber ido pls equivocadas? Gracias.

Publicado el 02/09/2018 a las 04:57
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

El problema está aquí:

canvasImageView.image?.draw(in: CGRect(x: 0, y: 0, width: canvasImageView.frame.size.width, height: canvasImageView.frame.size.height))

Que está dibujando la imagen utilizando el marco de la vista de la imagen. Esto estira la imagen.

Es necesario para dibujar la imagen como si contentMode es .scaleAspectFit.

Para ello, determinar primero la relación de aspecto de la imagen (W: H). Usted puede hacer esto mediante el acceso de la sizepropiedad de UIImage. Comparar esta relación con la relación de aspecto de la vista de la imagen.

Si la relación de la imagen es menor que el punto de vista de, entonces eso significa que la altura a la que se traza la imagen puede ser la misma que la altura vista de la imagen, y el ancho de la imagen se puede calcular utilizando la relación de aspecto de la imagen.

Si la relación de la imagen es mayor que el punto de vista de, entonces eso significa que la anchura en la que se dibuja la imagen puede ser la misma que la anchura de vista de la imagen, y la altura de la imagen se puede calcular,

Respondida el 02/09/2018 a las 07:51
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more