首页 > 解决方案 > 如何快速将背景图像添加到 canvasView(由 PencilKit 制作)中?

问题描述

我制作绘图书应用程序。我pencilKit很快就制作了所以作为我在这个问题中添加的图像。

所以我可以在canvasView. 但!!!我真的很想在相册里拍照所以我想用它作为我的背景canvasView

但是如果canvasView.addSubview(ImageView)在代码中,那么我的灰色 ImageView 就在我的 canvasView 的顶部,所以如果我绘制东西,那么这些东西就会在 canvasView 下绘制。

如果我使用imageView.sendSubviewToBack(canvasView),那么什么都不会发生。我真的知道如何在 RootView 和 canvasView 之间插入我的背景图像。

这是我的图像和代码。

关于视图层次结构

关于视图的外观

//
//  ViewController.swift
//  webtoon
//
//  Created by 신효근 on 2020/07/13.
//  Copyright © 2020 신효근. All rights reserved.
//

import UIKit
import PencilKit

class ViewController: UIViewController, PKCanvasViewDelegate, PKToolPickerObserver {

    @IBOutlet weak var canvasView: PKCanvasView!
    
    let canvasWidth : CGFloat = 768
    let canvasOverscrollHight : CGFloat = 500
    var imageView = UIImageView()
    var drawing = PKDrawing()
    let picker = UIImagePickerController()
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        canvasView.delegate = self
        canvasView.drawing = drawing
        canvasView.alwaysBounceVertical = true
        canvasView.allowsFingerDrawing = true
        
        
        if let window = parent?.view.window,
            let toolPicker = PKToolPicker.shared(for: window){
            toolPicker.setVisible(true, forFirstResponder:canvasView)
            toolPicker.addObserver(canvasView)
            canvasView.becomeFirstResponder()
        }
        
        self.imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 500)
        self.imageView.backgroundColor = .gray
        imageView.sendSubviewToBack(canvasView)
    }
    
//    override func viewDidLayoutSubviews() {
//        let canvasScale = canvasView.bounds.width/canvasWidth
//        canvasView.minimumZoomScale = canvasScale
//        canvasView.maximumZoomScale = canvasScale
//        canvasView.zoomScale = canvasScale
//    }
    
    override var prefersHomeIndicatorAutoHidden: Bool {
        return true
    }


    @IBAction func saveDrawingToCameraRoll(_ sender: Any) {
        
    }
    
    
    @IBAction func addButtonPressed(_ sender: Any) {
          self.present(self.picker, animated: true)
    }
    
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        var newImage: UIImage? = nil
        print("Start")
        print(info)
        print("end")
        if let possibleImage = info["UIImagePickerControllerEditedImage"] as? UIImage { // 수정된 이미지가 있을 경우
            newImage = possibleImage
        } else if let possibleImage = info["UIImagePickerControllerOriginalImage"] as? UIImage { // 오리지널 이미지가 있을 경우
            newImage = possibleImage
        }
        
        imageView.image = newImage // 받아온 이미지를 이미지 뷰에 넣어준다.
        
        picker.dismiss(animated: true) // 그리고 picker를 닫아준다.
    }
}

标签: swiftxcodecanvasviewhierarchy

解决方案


这是我的代码,它对我有用

    canvasView.isOpaque = false
    canvasView.backgroundColor = UIColor.clear
    canvasView.delegate = context.coordinator
    canvasView.becomeFirstResponder()
    
    let imageView = UIImageView(image: canvasImage)
    imageView.contentMode = .scaleAspectFill
    imageView.clipsToBounds = true

    let contentView = canvasView.subviews[0]
    contentView.addSubview(imageView)
    contentView.sendSubviewToBack(imageView)

推荐阅读