Попытка реализовать функцию рисования в Swift 5 с помощью касания - PullRequest
0 голосов
/ 07 февраля 2020

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

У нас есть несколько файлов, один из которых называется TraceViewController, с UICollectionView с выбором всех букв в алфавите. Когда вы нажимаете на одну из них, она отображает букву для отслеживания. У нас также был настроен класс CanvasView, связанный с UIView в раскадровке. Тем не менее, независимо от того, что мы делаем, теперь будут отображаться штрихи. Мы даже точно следовали этому руководству, используя код из GitHub: https://www.youtube.com/watch?v=kAiknPhkWmc, и мы все еще не можем отобразить штрихи. Если мы запустим проект отдельно, это нормально, но копирование его в наш проект, таким же образом, ничего не даст нам.

Мы думали, что это может быть связано с тем, что он скрыт за изображением письма это отображается, когда эта буква нажата в представлении коллекции, но мы также попытались безуспешно запрограммировать canvasView на sendToFront.

Я не совсем уверен, как разместить код, так как это 3 файла с много кода, но мне было интересно, есть ли у кого-нибудь идеи о том, что может пойти не так? Кажется, все розетки подключены нормально, и мы совершенно уверены, что фактический рисунок запускается и отображается в фоновом режиме, но мы просто ничего не видим.

Пожалуйста, дайте мне знать, если есть какие-либо части код, который может быть полезен для понимания проблемы.

Вот класс CanvasView, взятый из руководства:

import Foundation
import UIKit

struct TouchPointsAndColor {
    var color: UIColor?
    var width: CGFloat?
    var opacity: CGFloat?
    var points: [CGPoint]?

    init(color: UIColor, points: [CGPoint]?) {
        self.color = color
        self.points = points
    }
}

class CanvasView: UIView {

    var lines = [TouchPointsAndColor]()
    var strokeWidth: CGFloat = 1.0
    var strokeColor: UIColor = .black
    var strokeOpacity: CGFloat = 1.0

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        print("drawing")
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }

        lines.forEach { (line) in
            for (i, p) in (line.points?.enumerated())! {
                if i == 0 {
                    context.move(to: p)
                } else {
                    context.addLine(to: p)
                }
                context.setStrokeColor(line.color?.withAlphaComponent(line.opacity ?? 1.0).cgColor ?? UIColor.black.cgColor)
                context.setLineWidth(line.width ?? 1.0)
            }
            context.setLineCap(.round)
            context.strokePath()
        }


   }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        lines.append(TouchPointsAndColor(color: UIColor(), points: [CGPoint]()))
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first?.location(in: nil) else {
            return
        }

        guard var lastPoint = lines.popLast() else {return}
        lastPoint.points?.append(touch)
        lastPoint.color = strokeColor
        lastPoint.width = strokeWidth
        lastPoint.opacity = strokeOpacity
        lines.append(lastPoint)
        setNeedsDisplay()
    }

    func clearCanvasView() {
        lines.removeAll()
        setNeedsDisplay()
    }

    func undoDraw() {
        if lines.count > 0 {
            lines.removeLast()
            setNeedsDisplay()
        }
    }

}

TraceViewController:

import Foundation
import UIKit
import AVFoundation

protocol CollectionViewCellDelegate: class {
    func didSelect(_ cell: UICollectionViewCell ,_ button: UIButton)
}

class TraceViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 26;
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "letterCell",
                                                     for: indexPath)
        //cell.backgroundColor = UIColor.black
        switch currentType
        {
        case "AnimalUpper":
            cell.backgroundView = UIImageView(image: UIImage(named: "set1_\(alphabet[indexPath.row]).png"))
        case "AnimalLower":
            cell.backgroundView = UIImageView(image: UIImage(named: "set2_\(alphabet[indexPath.row]).png"))
        case "FontUpper":
            cell.backgroundView = UIImageView(image: leafCreator(ALPHABET[indexPath.row]))
        case "FontLower":
            cell.backgroundView = UIImageView(image: leafCreator(alphabet[indexPath.row]))
        default:
            break;
        }

        //cell.backgroundView = UIImageView(image: UIImage(named: "set1_\(alphabet[indexPath.row]).png"))

        //cell.backgroundView = [[UIImageView alloc] initWithImage:[self getImageForLetter:letter]];
        // Configure the cell
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: 118, height: 118)
    }


    weak var delegate: CollectionViewCellDelegate?
//    @IBOutlet weak var AnimalView: UIView!
//    @IBOutlet weak var FontView: UIView!
    @IBOutlet weak var btnBack: UIButton!
    @IBOutlet weak var traceView: UIImageView!
    @IBOutlet weak var btnRetry: UIButton!
    @IBOutlet weak var letterStyle: UISegmentedControl!

    @IBOutlet weak var letterImage: UIImageView!
    @IBOutlet weak var colViewTrial: UICollectionView!


    @IBOutlet weak var imagestyle: UISegmentedControl!

    @IBOutlet weak var AnimalColView: UIView!
    @IBOutlet weak var FontLowerColView: UIView!
    @IBOutlet weak var FontUpperColView: UIView!
    @IBOutlet weak var canvasView: CanvasView!


    //Tracing
    @IBOutlet weak var congratulationsImage: UIImageView!



    var congratulations: [UIImage]!
    var player: AVAudioPlayer?

    let congratulationsAnimDuration = 1.3
    let congratulationsAnimFadeOutAfter = 1.5

    var audioPlayer: AVAudioPlayer!
    var currentType = "AnimalUpper";
    //var currentLetter = "A";
    var alphabet: [String]!
    var ALPHABET: [String]!
    var app = AppDelegate();
    static var curLetter = "A"
    let cellSize = CGSize(width: 118, height: 118)

    var blurView = UIVisualEffectView()

    var colorsArray: [UIColor] = [#colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1), #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), #colorLiteral(red: 1, green: 0.4059419876, blue: 0.2455089305, alpha: 1), #colorLiteral(red: 0.1764705926, green: 0.01176470611, blue: 0.5607843399, alpha: 1), #colorLiteral(red: 0.1764705926, green: 0.4980392158, blue: 0.7568627596, alpha: 1), #colorLiteral(red: 1, green: 0.4059419876, blue: 0.2455089305, alpha: 1), #colorLiteral(red: 0.06274510175, green: 0, blue: 0.1921568662, alpha: 1), #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1), #colorLiteral(red: 0.2745098174, green: 0.4862745106, blue: 0.1411764771, alpha: 1), #colorLiteral(red: 0.3647058904, green: 0.06666667014, blue: 0.9686274529, alpha: 1), #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1), #colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1), #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), #colorLiteral(red: 0.3176470697, green: 0.07450980693, blue: 0.02745098062, alpha: 1), #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1), #colorLiteral(red: 0.3823936913, green: 0.8900789089, blue: 1, alpha: 1), #colorLiteral(red: 1, green: 0.4528176247, blue: 0.4432695911, alpha: 1), #colorLiteral(red: 0.05882352963, green: 0.180392161, blue: 0.2470588237, alpha: 1), #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)]


    @IBAction func btnBackDown(_ sender: Any) {
        btnBack.setImage(UIImage(named:"backButtonDown.png"), for: .normal)

    }
    @IBAction func btnBackPressed(_ sender: Any) {
        btnBack.setImage(UIImage(named:"backButtonUp.png"), for: .normal)
        //add audio file to button
        let audioFilePath = Bundle.main.path(forResource: "Click", ofType: "mp3")
        let audioUrl = NSURL(fileURLWithPath: audioFilePath!)
        audioPlayer = try! AVAudioPlayer(contentsOf: audioUrl as URL)
        audioPlayer.play()

        self.dismiss(animated: true, completion: nil)
    }
    @IBAction func btnBackUpOutside(_ sender: Any) {
        btnBack.setImage(UIImage(named:"backButtonUp.png"), for: .normal)
    }

    @IBAction func retryButtonPress(_ sender: UIButton) {
        //canvasView.clearCanvas()
    }
    @IBAction func soundButtonPress(_ sender: UIButton) {
        //playSound(soundFile: "\(self.canvasView.letter.lowercased()) letter")
    }

    @IBAction func indexChanged(_ sender: Any) {
        switch letterStyle.selectedSegmentIndex
        {
        case 0:
            switch imagestyle.selectedSegmentIndex {
            case 0:
                currentType = "AnimalUpper"
                print(currentType)
            case 1:
                currentType = "FontUpper"
                print(currentType)
            default:
                break;
            }
        case 1:
            switch imagestyle.selectedSegmentIndex {
            case 0:
                currentType = "AnimalLower"
                print(currentType)
            case 1:
                currentType = "FontLower"
                print(currentType)
            default:
                break;
            }
        default:
            break;
        }
        self.colViewTrial.reloadData()
    }


    @IBAction func fontChange(_ sender: Any) {
        switch imagestyle.selectedSegmentIndex {
        case 0:
            switch letterStyle.selectedSegmentIndex {
            case 0:
                currentType = "AnimalUpper"
                print(currentType)
            case 1:
                currentType = "AnimalLower"
                print(currentType)
            default:
                break
            }
        case 1:
            switch letterStyle.selectedSegmentIndex {
            case 0:
                currentType = "FontUpper"
                print(currentType)
            case 1:
                currentType = "FontLower"
                print(currentType)
            default:
                break
            }
        default:
            break
        }
        self.colViewTrial.reloadData()
    }

    // Get the point where the user clicks and converts to where in the collection view it is
    @IBAction func letterChange(_ sender: UIButton) {
        let hitPoint = sender.convert(CGPoint.zero, to: colViewTrial)
        let idxPth = colViewTrial.indexPathForItem(at: hitPoint)

        if idxPth != nil {
            TraceViewController.curLetter = ALPHABET[idxPth!.row]
            switch currentType
            {
            case "AnimalUpper":
                letterImage.image = UIImage(named: "Big\(TraceViewController.curLetter).png")
            case "AnimalLower":
                letterImage.image = UIImage(named: "Small\(TraceViewController.curLetter).png")
            case "FontUpper":
                letterImage.image = UIImage(named: "Big\(TraceViewController.curLetter).png")
            case "FontLower":
                letterImage.image = UIImage(named: "Small\(TraceViewController.curLetter).png")
            default:
                break;
            }

        }
        print(TraceViewController.curLetter)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        //view.addSubview(canvasView)

        self.view.backgroundColor = UIColor(patternImage: UIImage(named:"Background_main.png")!)
        //self.canvasView.clearCanvas()


        letterImage.image = UIImage(named: "Big\(TraceViewController.curLetter).png")


        //viewDidLoad() is being called every time letter is changed - remove current drawings


        // self.canvasView.letter = TraceViewController.curLetter
        print(app.getFont()!)

        alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
        ALPHABET = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]




    func leafCreator(_ letter: String) -> UIImage {
        let tempImage = UIImage(named: "Leaf_Front.png")
        let font = UIFont(name: app.getFont(), size: 70)
        let paraStyle = NSMutableParagraphStyle()
        paraStyle.alignment = .center
        var leafImage: UIImage?
        UIGraphicsBeginImageContext(cellSize)
        tempImage?.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: cellSize))

        let rect = CGRect(origin: CGPoint(x: 15, y: 25), size: CGSize(width: 85, height: 85))
        UIColor.black.set()
        let attrsDict = [NSAttributedString.Key.font: font, NSAttributedString.Key.paragraphStyle:paraStyle]
        letter.draw(in:rect, withAttributes: attrsDict as [NSAttributedString.Key : Any])
        leafImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return leafImage!
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromAVAudioSessionCategory(_ input: AVAudioSession.Category) -> String {
    return input.rawValue
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromAVFileType(_ input: AVFileType) -> String {
    return input.rawValue
}
...