2016-11-12 8 views
2

Спасибо за ваше время.Режим содержания моего ImageView перестает работать после того, как я рисую что-то на изображении

Изображение прекрасное, прежде чем я коснусь изображения, а затем изображение будет уплотнено после того, как я коснусь его.

Вот мой код:

Я не использую раскадровки, поэтому я создаю все с кодом, здесь ImageView. И я добавил ограничения с кодом.

let imageEditingView: UIImageView = { 
    let imageView = UIImageView() 
    imageView.contentMode = .scaleAspectFill 
    imageView.clipsToBounds = true 
    return imageView 
}() 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if touches.first != nil { 
     lastPoint = (touches.first?.location(in: imageEditingView))! 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if touches.first != nil { 
     let currentPoint = touches.first?.location(in: imageEditingView) 
     drawLines(fromPoint: lastPoint, toPoint: currentPoint!) 

     lastPoint = currentPoint! 
     drawLines(fromPoint: lastPoint, toPoint: lastPoint) 
    } 
} 

func drawLines(fromPoint: CGPoint, toPoint: CGPoint) { 
    UIGraphicsBeginImageContext(imageEditingView.frame.size) 
    imageEditingView.image?.draw(in: CGRect(x: 0, y: 0, width: imageEditingView.frame.width, height: imageEditingView.frame.height)) 

    let context = UIGraphicsGetCurrentContext() 
    context?.move(to: CGPoint(x: fromPoint.x, y: fromPoint.y)) 
    context?.addLine(to: CGPoint(x: toPoint.x, y: toPoint.y)) 
    context?.setBlendMode(CGBlendMode.normal) 
    context?.setLineCap(CGLineCap.round) 
    context?.setLineWidth(CGFloat(Int(120 * lineWidthSliderView.value))) 
    context?.setStrokeColor(red: red/255, green: green/255, blue: blue/255, alpha: 0.01) 
    context?.strokePath() 

    imageEditingView.image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
}  

ответ

0

Я не знаю, что вы подразумеваете под «уплотняют», но я предполагаю, что изображение будет поврежден каким-либо образом потому, что некоторые данные будут потеряны при преобразовании изображения в CGContext и обратно в изображение.

Я не знаю, как это исправить, но я бы просто обойти эту проблему, добавив CAShapeLayer в качестве подслоя к UIImageView, и рисование, что вы хотите там в виде CGPath. Синтаксис очень похож на то, что вы используете прямо сейчас, и единственным эффектом, который может не поддерживаться, является режим смешивания, но вы можете воссоздать его с другим уровнем с более низким значением альфа.

Вот как это будет выглядеть.

var drawingLayer = CAShapeLayer() 
func drawLines(fromPoint: CGPoint, toPoint: CGPoint) { 
    let mutable = CGMutablePath() 
    mutable.move(to: fromPoint) 
    mutable.addline(to: toPoint) 
    drawingLayer.path = mutable 
    drawingLayer.fillColor = nil 
    drawingLayer.lineCap = kCALineCapRound 
    drawingLayer.lineCap = 120 * CGFloat(lineWidthSliderView.value) 
    //the bit in your code translated the whole thing to Int before translating it to a 
    //CGFloat, this is a bad idea since Ints cannot store decimals, so if there is no 
    //direct conversion, convert it to Double or Float 
    drawingLayer.strokeColor = UIColor(calibratedRed: red/255, green: green/255, blue: blue/255 , alpha: 1).cgColor 

} 

Где-то вы должны были бы сделать imageEditingView.addSubLayer(drawingLayer)

также, что вам не нужно, чтобы преобразовать CGPoint в другой CGPoint, когда вы делаете context.move(to:) и другие места ...

+0

Спасибо вам много! Это решило проблему, но когда я использую UIImageWriteToSavedPhotosAlbum, она сохранила только изображение, оно не сохраняет рисунок на DrawLayer. Как сохранить изображение с помощью DrawLayer на нем? –

+0

Я нашел решение, передав изображение другой переменной и сохранил ее. Еще раз спасибо! –