Как разместить изображение над изображением, используемым для рисования - PullRequest
0 голосов
/ 13 октября 2019

Мой код подклассов uiview в класс uiview. Единственное, я хочу поместить изображение поверх изображения, чтобы помочь мне рисовать. Я не знаю, возможно ли это. Но я хочу сделать это. Я пытаюсь инициализировать uiimage в классе, где объявлен чертежный вид. Сейчас я не могу этого сделать, потому что это обзор.

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var drawingView: DrawingView!

override func viewDidLoad() {
    super.viewDidLoad()


    let star:UIImage = UIImage(named: "e.png")!
              let newSize = CGSize(width: star.size.width, height: star.size.height  )

              UIGraphicsBeginImageContextWithOptions(newSize, false, star.scale)

              star.draw(in: CGRect(x: newSize.width/12,
                                   y: newSize.height/8,
                                   width: newSize.width/1.2,
                                   height: newSize.height/1.2),
                        blendMode:CGBlendMode.normal, alpha:1)



              let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
              UIGraphicsEndImageContext()

    //place newImage OVer UIVIew
    drawingView

}
}

class DrawingView: UIView {

var drawColor = UIColor.black
var lineWidth: CGFloat = 5

private var lastPoint: CGPoint!
private var bezierPath: UIBezierPath!
private var pointCounter: Int = 0
private let pointLimit: Int = 128
private var preRenderImage: UIImage!

// MARK: - Initialization

override init(frame: CGRect) {
    super.init(frame: frame)

    initBezierPath()


}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    initBezierPath()
}

func initBezierPath() {
    bezierPath = UIBezierPath()
    bezierPath.lineCapStyle = CGLineCap.round
    bezierPath.lineJoinStyle = CGLineJoin.round
}

// MARK: - Touch handling

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch: AnyObject? = touches.first
    lastPoint = touch!.location(in: self)
    pointCounter = 0
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch: AnyObject? = touches.first
    let newPoint = touch!.location(in: self)

    bezierPath.move(to: lastPoint)
    bezierPath.addLine(to: newPoint)
    lastPoint = newPoint

    pointCounter += 1

    if pointCounter == pointLimit {
        pointCounter = 0
        renderToImage()
        setNeedsDisplay()
        bezierPath.removeAllPoints()
    }
    else {
        setNeedsDisplay()
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    pointCounter = 0
    renderToImage()
    setNeedsDisplay()
    bezierPath.removeAllPoints()
}

override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
    touchesEnded(touches!, with: event)
}

// MARK: - Pre render

func renderToImage() {

    UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0)
    if preRenderImage != nil {
        preRenderImage.draw(in: self.bounds)
    }

    bezierPath.lineWidth = lineWidth
    drawColor.setFill()
    drawColor.setStroke()
    bezierPath.stroke()

    preRenderImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()
}

// MARK: - Render

override func draw(_ rect: CGRect) {
    super.draw(rect)

    if preRenderImage != nil {
        preRenderImage.draw(in: self.bounds)
    }

    bezierPath.lineWidth = lineWidth
    drawColor.setFill()
    drawColor.setStroke()
    bezierPath.stroke()
}

// MARK: - Clearing

func clear() {
    preRenderImage = nil
    bezierPath.removeAllPoints()
    setNeedsDisplay()
}

// MARK: - Other

func hasLines() -> Bool {
    return preRenderImage != nil || !bezierPath.isEmpty
}
}
...