我的应用程序代表了一个小型的报告评论,我有一个自定义的画布视图(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
比率)。