【问题标题】:Annotate table view on iPad Pro with Pencil使用 Pencil 在 iPad Pro 上注释表格视图
【发布时间】:2016-08-20 11:42:04
【问题描述】:

我正在为 iPad Pro 构建一个应用程序,它有一个 UITableView 显示一个包含项目的目录。有许多目录,每个目录都有 1000 件商品。

目标

我想了解如何(最好)使用 Pencil 在 UITableView 中注释内容,以便用户可以用手指滚动。此外,用户绘制的内容会保存在数据模型中。

让我解释一下我的尝试。

单个 UIView

我在自定义 UITableView 之上放置了一个 UIView,该 UITableView 覆盖 touch.type == UITouchType.Stylus 上的 touchesBegan/Moved/Ended/Canceled 函数和过滤器,以了解何时是手指,何时是铅笔。这行得通,但这不是一个好的解决方案,因为图像会很大,甚至无法放置一些包含太多项目的目录。

每行一个 UIView

适用于大型目录,但出现了无法跨行绘制的问题,这必须是可能的。我还没有找到一种方法来保持手势跨越不同的视图。这是可能的还是有某种解决方法?

修复了屏幕上的 UIView

滚动时跟随,容易在任何东西上绘制,但不清楚且难以将绘制的东西固定到表格坐标以及持久化。感觉不太对劲,因为可能要跟随屏幕大小的画布似乎过于复杂,并且绘制的任何内容都转换为 UIImageView 以用于它跨越的行并持续存在......这就是我现在所在的地方,我可以展示一些代码,如果这种方法有意义的话。

有没有更好的方法来解决这个问题,因为在我看来这应该是现在使用 Pencil 非常自然的需要,即在表格视图中进行注释和持久化。

有没有人做过这样的事情或者我忽略了什么?也许是某种稀疏的 UIImageView,这样我就可以在一张巨大的桌子上放一个?

我正在寻找一个好的解决方案和示例代码,具体取决于解决方案的参与程度。

谢谢!

更新

为了澄清,表中的项目以固定方式排序,因此可以使用它来将绘制/注释的内容作为部分内容持久保存。

通常,绘图/注释可以保存为 1 到 N 个图像。在许多情况下,一个图像太大了,因为项目数以千计,N 个图像意味着存在一个手势被中断的边界,并且由于绘图不连续,因此不适合可用性(除非这可以解决哪个会很棒)。

数据模型可以是目录 [ -> pages ] -> items 但我不希望有一个页面概念,因为它(更长的原因很短)使每页的项目更小,而重点是最大化项目以更容易注释。

【问题讨论】:

  • 注释是否连接到表格视图中的单个项目?如果表格视图中项目的顺序发生变化,注释是否应该遵循新的顺序?
  • 是的,非常好的问题。这当然都与这个具体案例有关,顺序是固定的,不会改变。注释不一定要连接到特定的行/项目,但如果它有助于持久化(小图像还是大图像?)
  • 当然,注释与项目/行有关。 IE。您为该特定行/项目标记某些内容或评论某些内容。此外,您可能想要标记/注释一系列项目,因此绘图/注释应该跨越多行/项目。

标签: ios uitableview ipad


【解决方案1】:

我想我会按照以下方式进行。

[draw layer]
[annotation layer]
[table view] 

三层,底部是表格视图。 顶层是固定的,用于绘图。一旦绘制了注释,它将被移动到同样固定的注释层。

当绘图被移动到注解层时,它应该被转换到tableview层坐标系(tableview中的内容偏移量+draw层中的偏移量)

一旦滚动表格视图,注释层坐标系就会被转换为CGAffineTransform,这将移动所有子图层,以便注释将随着表格视图“滚动”。澄清一下,注解层坐标系应该始终与 tableview 的内容偏移量同步。

【讨论】:

  • 谢谢,但这并不能解决我所解释的所有问题。
【解决方案2】:

好的,所以似乎没有人这样做。

我现在每行都有一个绘图画布,该画布也作为图像持续存在。这样做的主要问题是使绘图在表格行之间连续且不间断。

我这样做的方式是在我的自定义表格视图类中使用hitTest 来捕捉触摸:

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView?
{
    if let result = super.hitTest(point, withEvent: event) {
        if let sv = result.superview {
            if sv.isKindOfClass(TableHeaderView) {
                return result
            }
        }
        return self
    }
    return nil
}

...然后在touches* 函数中,如果它是铅笔,我将禁用/启用滚动,然后委托给相应的单元格进行绘制和持久化。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    if let touch = touches.first {
        if touch.type == UITouchType.Stylus {
            scrollEnabled = false

            let location = touch.locationInView(self)
            // find underlying cell -> call drawTouches
            for visibleCell in visibleCells {
                if let cell = visibleCell {
                    if CGRectContainsPoint(cell.frame, location) {
                        cell.touchesBegan(touches, withEvent: event)
                        break
                    }
                }
            }
        }
    }
}

主要思想是在表格视图中进行整体控制以保持手势连续。实现此目的的另一种方法是使用单个屏幕固定画布并委托给表格单元格。在我的情况下,还要关心的是滚动到允许手指滚动和铅笔画。 UIScrollView 派生自UITableViewUIScrollView 捕获手势,因此无需在表格视图类中延迟手势。

    delaysContentTouches = false

效果很好,但不确定是否有更好的方法,所以请发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多