我的应用程序代表了一个小型的报告评论,我有一个自定义的画布视图(UIView),用户可以在其中绘制。
当用户完成绘制时,将能够单击AddUIButton并将涂鸦附加到对象上。每个对象表示表中的一行。
当用户单击任意行时,CanvasView上的涂鸦颜色将更改,以便用户更容易看到。
当用户完成所有绘制后,可以单击SaveUIButton将报表序列化并保存为CoreData中的Data
用户可以查看反序列化报告。
问题是涂鸦的比例不正确(我认为),CanvasView上的cg点位于不同的位置。
以下是我的小项目的链接:
https://github.com/tygruletz/SelectScribblesUsingBinaryData
当我序列化时,我使用这个函数:

func serializeDamageItemsTTable(damageItems: [DamageItem], canvas: CanvasView) -> TTable {

    var metaDamage: [TMeta] = []

    metaDamage.append(TMeta(type: .s, name: "descript"))            // DamageItem Name
    metaDamage.append(TMeta(type: .z, name: "scribble"))            // Coordinates for each scribble recorded on the image for DamageItem

    let ttDamageItems = TTable(meta: metaDamage)

    print("SERIALIZATION STARTED")

    damageItems.forEach { damageItem in

        let row = TRow(tMeta: metaDamage)

        row.cell.append(TCell(s: damageItem.name))                  // DamageItem Name

        var scribbleCoord = [UInt8]()

        damageItem.scribbles.forEach { scribble in

            var firstPointInScribble = true
            scribble.forEach { coordinate in

                // ------ Scale all CGPoints ---------
                let factor: CGFloat = 240 / canvas.bounds.width
                let scaledX = UInt8(coordinate.x * factor)
                let scaledY = UInt8(coordinate.y * factor)

                if (coordinate.x > 0 && coordinate.x < 255) && (coordinate.y > 0 && coordinate.y < 127) {
                    scribbleCoord.append(scaledX)                               // Append X coord

                    if firstPointInScribble {
                        firstPointInScribble = false
                        scribbleCoord.append(scaledY | Scribble.yMarkerBitmask) // Append value 1 in front of Y coord + Y coord
                    } else {
                        scribbleCoord.append(scaledY)
                    }
                }
            }
        }
        row.cell.append(TCell(data: scribbleCoord))                // Coordinates for each scribble recorded on the image for DamageItem

        print("Damage Item Scribble: \(scribbleCoord)")
        print("SERIALIZATION ENDED")

        do{
            try ttDamageItems.add(row: row)
        } catch{
            print("serializeDamageTTable: Row can't be added: \(error)")
        }
    }
    return ttDamageItems
}


当我反序列化时,我使用这个:
// Resize back all CGPoints
    func scaleAllCGPoints(damageItems: [DamageItem], canvas: CanvasView) -> [[CGPoint]] {

        return damageItems.flatMap { damageItem in

            damageItem.scribbles.map { scribble in

                scribble.map { point in
                    let factor: CGFloat = 240 / canvas.bounds.width
                    let scaledX = point.x / factor
                    let scaledY = point.y / factor
                    return CGPoint(x: scaledX, y: scaledY)
                }
            }
        }
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        switch indexPath.section {
        // Cell with the image recorded + scribbles on the image
        case 0:
            let cell = tableView.dequeueReusableCell(withIdentifier: "reviewCanvasCell", for: indexPath) as! ReviewCanvasCell

            // ------ Resize back all CGPoints ---------
            let scribbleCGPoints = scaleAllCGPoints(damageItems: reviewDamageItems, canvas: cell.reviewCanvas)
            cell.reviewCanvas.currentScribble = scribbleCGPoints

            // ------ Unscaled version ---------
            cell.reviewImageView.image = UIImage(data: report.imageRecorded ?? Data())  // Load Image recorded from CoreData
            cell.reviewCanvas.damageItems = reviewDamageItems                           // Load Scribbles on the image from CoreData
            cell.selectedDamageIndex = tableView.indexPathForSelectedRow?.row
            return cell

        default: return UITableViewCell()
        }
    }


谢谢你看这个!

最佳答案

夫妇需要改变。。。
防止坐标越界。当用户拖动绘制线时,如果坐标超出“画布”视图的边界,请将x/y更改为最小值0(零),并将max of bounds.maxX/bounds.maxY
将画布视图高度更改为imageView的纵横比的结果高度(在特定情况下,图像将始终处于240:127比率)。

10-07 19:54
查看更多