gpt4 book ai didi

ios - 如何在自定义 UIView 上显示 CGPoints

转载 作者:行者123 更新时间:2023-12-02 13:14:17 25 4
gpt4 key购买 nike

我有一个小项目,它代表一个带有报告的应用程序,用户可以在自定义 CanvasView 上绘图,然后选择绘制的每个涂鸦。当用户单击 Save UIButton 时,报告将被序列化并保存在 CoreData 中。当用户单击任何报告进行查看后,它将被带到 DetailsVC,其中报告将从 CoreData 反序列化,并且能够看到 上的涂鸦>CanvasView 但不再绘制。问题是,没有向我显示 CanvasView (DetailsVC) 上的涂鸦,而是在控制台中显示涂鸦数组不为空,并且是从 CoreData 加载的。

编辑:我认为问题出在下面一行,我认为正在遍历一个空数组并尝试附加 CGPoints ,但我不知道如何修复它。谁能帮我实现这样的功能:

func parseScribbleData(_ bytes: [UInt8]) -> [[CGPoint]] {

}

https://github.com/tygruletz/SelectScribbles/blob/master/SelectScribbles/Communications/TTableDeserializer.swift#L34

这是我的演示项目:https://github.com/tygruletz/SelectScribbles

这里是反射(reflect)该错误的记录(CanvasView 中缺少 CGPoints): enter image description here

以下是我反序列化涂鸦的方法:

class TTableDeserializer: NSObject {

static let sharedInstance = TTableDeserializer()

// Deserialize all the damageItems recorded from the Report
func deserializeDamageItemsFor(report: DefectReport) -> [DamageItem] {

let damageLinesTTable: TTable = TTable(binaryTable: Data(), format: .bin1)
var damageItems: [DamageItem] = []

// Get the DamageList with damage items for selected Report.
damageLinesTTable.deStreamBin(binaryData: report.damageLines ?? Data(), format: .bin1)

damageLinesTTable.tableRows.forEach { row in

var damageItem: DamageItem = DamageItem(name: row.cell[0].sData,
scribbles: [])

// All Scribbles
var allCGPoints = [[CGPoint]]()

damageItem.scribbles.forEach { scribble in

var scribbleCGPoints = [CGPoint]()
scribble.forEach { coordinate in

let point = CGPoint(
x: CGFloat(UInt8(row.cell[3].iData())),
y: CGFloat(UInt8(row.cell[3].iData()) & (~0 >> 1))
)
scribbleCGPoints.append(point)
}
allCGPoints.append(scribbleCGPoints)
}

damageItem.scribbles = allCGPoints

damageItems.append(damageItem)

print("---------- DESERIALIZATION FOR DAMAGE ITEM '\(row.cell[0].sData.capitalized)' STARTED.......... ----------")
print("Dmg Item Name: \(row.cell[0].sData)")
print("Dmg Item Scribble: \(row.cell[1].binData())")
print("---------- DESERIALIZATION FOR DAMAGE ITEM '\(row.cell[0].sData.capitalized)' ENDED ----------\n\n")
}
return damageItems
}
}

感谢您阅读本文!

最佳答案

参见this pull request它解决了一些问题:

  • 我们希望以捕获涂鸦数组的方式对 CoreData 中的损坏数组进行编码。现在您似乎想要存储一个整数数组,并且您确实想要捕获 DamageItem 中的 [[CGPoint]] 结构。

    <
  • 最简单的方法是使 DamageItem 符合 Codable,然后用标准 Foundation 编码器替换所有复杂的编码(我使用 JSONEncoder/JSONDecoder)。

    这不仅正确捕获了 DamageItem 的丰富性,而且从根本上简化了编码/解码过程;

    编码就是:

    report.damageLines = try JSONEncoder().encode(damages)

    解码就是:

    let items = try JSONDecoder().decode([DamageItem].self, from: report.damageLines)
  • 如果您希望您的 DetailsReport View Controller 享受“选择损坏并突出显示适当的涂鸦”功能(like we did 表示您的 CreateReport),您'需要更新自定义表格单元格以捕获选定的损坏并将其传递到 CanvasView

    您还需要 DetailsReport 中的 didSelectRowAt 重新加载第一部分(以便您可以看到选定的损坏)。

<小时/>

不相关,我还建议:

  • UIBezierPath 例程移出模型文件夹(因为它不是模型)。

  • 出于同样的原因,还将 CanvasView 移动到 View 文件夹中。

关于ios - 如何在自定义 UIView 上显示 CGPoints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58541532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com