Аннотируйте представление таблицы на 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
, которая перемещает все подслои так, что аннотации будут "прокручиваться" с помощью таблицы. Чтобы уточнить, система координат слоев аннотаций должна всегда синхронизироваться со смещением содержимого таблицы.