Аннотируйте представление таблицы на iPad Pro с карандашом

Я создаю приложение для iPad Pro, у которого есть UITableView, показывающий каталог с элементами. Есть много каталогов, каждый из которых содержит 1 тысячу элементов.

Цель

Я хотел бы узнать, как (лучше всего) дать возможность комментировать вещи в UITableView с помощью карандаша, чтобы пользователь мог прокручивать пальцем. Кроме того, то, что нарисовал пользователь, сохраняется в модели данных.

Позвольте мне объяснить, что я пробовал.

Одиночный UIView

Я помещаю один UIView поверх пользовательского UITableView, который переопределяет функции и фильтры touchesBegan/Moved/Ended/Canceled на touch.type == UITouchType.Stylus, чтобы знать, когда он палец и когда он карандаш. Это работает, но это не очень хорошее решение, так как изображение будет огромным и даже не возможно поставить для некоторых каталогов слишком много элементов.

В строке a UIView

Хорошо работает с большим каталогом, но проблема возникла из-за невозможности рисовать по строкам, которые должны быть возможны. Я еще не нашел способ сохранить жест в разных взглядах. Возможно ли это или есть какое-то обходное решение?

Исправлено UIView на экране

Выполняется при прокрутке, легко нарисовать что-либо, но неясно и трудно исправить рисованный материал в координатах таблицы, а также сохранить его. Он не чувствовал себя так, как казалось слишком сложным, чтобы, возможно, иметь холст размером с экран, и все, что нарисовано, преобразуется в UIImageView для строк, которые он охватывает и сохраняется там... вот где я сейчас, и я могу показать некоторый код, если этот подход имеет смысл.

Есть ли лучший подход к этому, поскольку мне кажется, что теперь это должно быть очень естественной необходимостью с помощью Pencil, т.е. комментировать и сохраняться в виде таблицы.

Кто-нибудь сделал что-то подобное или есть что-то, что я упустил? Может быть, какой-то разреженный UIImageView, чтобы у меня был сингл через массивную таблицу?

Я ищу хорошее решение и пример кода в зависимости от того, как задействовано решение.

Спасибо!

UPDATE

Итак, чтобы уточнить, элементы в таблице упорядочены по-фиксированному, так что вы можете использовать это, чтобы сохранить рисованные/аннотированные вещи как частичные.

Как правило, чертежи/аннотации могут сохраняться как от 1 до N изображений. Одно изображение во многих случаях слишком велико, так как элементы много тысяч, N изображений означает, что есть граница, где жест прерывается, и это не идеально подходит для удобства использования, поскольку рисунок не является непрерывным (если это невозможно решить, будь велика).

Модель данных может быть каталогом [- > pages] → , но мне не хотелось бы иметь концепцию страницы, поскольку она (более короткая причина) уменьшает количество элементов на странице, и все дело в том, чтобы максимизировать элементы для его легче комментировать.

Ответ 1

Хорошо, поэтому никто, похоже, этого не сделал.

Теперь я работаю над каждой строкой холста для рисования, который также сохраняется как изображение. Основная проблема заключалась в том, что рисование было непрерывным и непрерывным в строках таблицы.

То, как я это делал, это использовать hitTest в моем классе Table View, чтобы поймать штрихи:

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

Работает очень хорошо, но не уверен, есть ли более хороший способ, пожалуйста, прокомментируйте.

Ответ 2

Я думаю, что я буду заниматься этим следующим образом.

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

Три слоя, с табличным видом внизу. Верхний слой является фиксированным и используется для рисования. Как только будет выделена аннотация, он будет перемещен на слой аннотации, который также будет исправлен.

Когда рисунок перемещается в слой аннотации, он должен быть переведен в систему координат слоев таблицы (смещение содержимого в виде таблицы + смещение в слое рисования)

Как только прокрутка таблицы просматривается, система координат слоев аннотации переводится с помощью CGAffineTransform, которая перемещает все подслои так, что аннотации будут "прокручиваться" с помощью таблицы. Чтобы уточнить, система координат слоев аннотаций должна всегда синхронизироваться со смещением содержимого таблицы.