Swift: Image miste størrelsesforholdet når Tegning Starter

stemmer
0

Jeg prøver å lage et bilde redigering VC for min app, og møtte over problemet. Når jeg begynner å tegne på mitt bilde, vil bildet deformere og deretter mister størrelsesforholdet.

Gif slik:

skriv

Mitt fulle kode slik:

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()
        }          
    }
}

Jeg tilpasset min uavgjort metode fra ulike tutorials på youtube, github og SO. Vil noen råd hvor jeg kunne ha gått galt pls? Takk.

Publisert på 02/09/2018 klokken 04:57
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Problemet er her:

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

Du tegner bildet ved hjelp av bildevisningen ramme. Denne strekker bildet.

Du må tegne bildet som om contentMode er .scaleAspectFit.

For å gjøre dette, først bestemme bildesideforhold (W: H). Du kan gjøre dette ved å få tilgang til sizeeiendom UIImage. Sammenlign dette forholdet til sideforholdet for bildevisningen.

Dersom bildets forholdet er mindre enn visning s, da det betyr at høyden hvor man tegne bildet kan være den samme som den bildevisningen høyde, og den bildebredde kan beregnes ved hjelp av sideforholdet til bildet.

Dersom bildet er forholdet er større enn visning s, da det betyr at bredden ved hvilken man tegne bildet kan være den samme som den bildevisningen bredde, og bildehøyden kan beregnes

Svarte 02/09/2018 kl. 07:51
kilden bruker

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