使用Pencil

时间:2016-04-26 14:48:36

标签: ios uitableview ipad

我正在为iPad Pro构建一个应用程序,该应用程序具有显示带有项目的目录的UITableView。有许多目录,每个目录都有成千上万的项目。

目标

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

让我解释一下我的尝试。

单一UIView

我在自定义UITableView上放置了一个UIView,它覆盖了touchesBegan/Moved/Ended/Canceled上的touch.type == UITouchType.Stylus函数和过滤器,以了解手指何时以及何时使用铅笔。这是有效的,但它不是一个好的解决方案,因为图像将是巨大的,甚至不可能为一些目录包含太多项目。

每行一个UIView

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

在屏幕上修正了UIView

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

有没有更好的方法,因为在我看来,这应该是一个非常自然的需要现在使用铅笔,即注释和持久在表格视图。

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

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

谢谢!

更新

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

通常,图纸/注释可以保存为从1到N个图像的任何内容。一个图像在很多情况下太大,因为项目数千,N图像意味着存在手势中断的边框,并且由于绘图不连续而不适合使用(除非这可以解决)这将是伟大的。)

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

2 个答案:

答案 0 :(得分:0)

我想我会用以下方式解决这个问题。

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

三层,底部有桌子视图。 顶层固定并用于绘图。一旦绘制了注释,它就会被移动到注释层,该注释层也是固定的。

当绘图移动到注释图层时,应将其转换为tableview图层坐标系(表视图中的内容偏移+绘图层中的偏移)

一旦滚动了tableview,注释图层坐标系就会被CGAffineTransform翻译,这将移动所有子图层,以便注释将随桌面视图“滚动”。为了澄清,注释图层坐标系应始终与tableview的内容偏移同步。

答案 1 :(得分:0)

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

我现在每行都有一个绘图画布,它也可以作为图像保留。这个问题的主要问题是在表格行中绘制连续和不间断的图形。

我这样做的方法是在我的自定义Table View类中使用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 UITableView来自捕获手势,因此不需要在表视图类中延迟手势。

    delaysContentTouches = false

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