2017-09-25 3 views
1

J'ai un contrôleur de vue simple où l'écran entier est un imageView. L'imageView a son mode de contenu défini sur UIViewContentMode.scaleAspectFill. Je peux dessiner sur l'image, mais dès que je fais l'image rétrécit horizontalement. Cela gâcher la qualité de l'image et je ne sais pas exactement pourquoi ça se passe. J'ai regardé this question, mais je n'ai pas compris la seule réponse. Je pense que le problème vient de la façon dont je dessine et que rect réduit l'image.Swift: dessine sur l'image sans changer sa taille (remplissage d'aspect)

class AnnotateViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 

    var lastPoint = CGPoint.zero 
    var fromPoint = CGPoint() 
    var toPoint = CGPoint.zero 
    var brushWidth: CGFloat = 5.0 
    var opacity: CGFloat = 1.0 


    @IBAction func startDrawing(_ sender: Any) { 
     self.isDrawing = !self.isDrawing 
     if isDrawing { 
      self.imageView.isUserInteractionEnabled = true 
      showColorButtons() 
     } 
     else { 
      self.imageView.isUserInteractionEnabled = false 
      hideColorButtons() 
     } 
    } 

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

    func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) { 
     UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, false, 0.0) 
     imageView.image?.draw(in: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height)) 

     let context = UIGraphicsGetCurrentContext() 
     context?.move(to: fromPoint) 
     context?.addLine(to: toPoint) 


     context?.setLineCap(CGLineCap.round) 
     context?.setLineWidth(brushWidth) 
     context?.setStrokeColor(red: 255, green: 0, blue: 0, alpha: 1.0) 
     context?.setBlendMode(CGBlendMode.normal) 
     context?.strokePath() 

     imageView.image = UIGraphicsGetImageFromCurrentImageContext() 
     imageView.alpha = opacity 
     UIGraphicsEndImageContext() 

    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first { 
      let currentPoint = touch.preciseLocation(in: self.imageView) 
      drawLineFrom(fromPoint: lastPoint, toPoint: currentPoint) 
      lastPoint = currentPoint 
     } 
    } 
} 

MISE À JOUR - SOLUTION

Je suis rentré à travailler sur ce problème. En regardant this question, j'ai été en mesure d'utiliser la réponse acceptée pour résoudre mon problème. Ci-dessous mon code mis à jour:

func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) { 
     UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, true, 0.0) 

     let aspect = imageView.image!.size.width/imageView.image!.size.height 
     let rect: CGRect 
     if imageView.frame.width/aspect > imageView.frame.height { 
      let height = imageView.frame.width/aspect 
      rect = CGRect(x: 0, y: (imageView.frame.height - height)/2, 
          width: imageView.frame.width, height: height) 
     } else { 
      let width = imageView.frame.height * aspect 
      rect = CGRect(x: (imageView.frame.width - width)/2, y: 0, 
          width: width, height: imageView.frame.height) 
     } 
     imageView.image?.draw(in: rect) 

     let context = UIGraphicsGetCurrentContext() 
     context?.move(to: fromPoint) 
     context?.addLine(to: toPoint) 
     context?.setLineCap(CGLineCap.round) 
     context?.setLineWidth(brushWidth) 
     context?.setStrokeColor(red: self.red, green: self.green, blue: self.blue, alpha: 1.0) 
     context?.setBlendMode(CGBlendMode.normal) 
     context?.strokePath() 

     imageView.image = UIGraphicsGetImageFromCurrentImageContext() 
     annotatedImage = imageView.image 
     imageView.alpha = opacity 
     UIGraphicsEndImageContext() 
    } 

Répondre

1

Cette ligne:

imageView.image?.draw(in: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height)) 

Dessine l'image au format d'image de l'écran, mais l'image est probablement pas au même rapport d'aspect (le rapport de la largeur à la hauteur). Je pense que cela pourrait être utile: UIImage Aspect Fit when using drawInRect?