NSView оставляет артефакты на другом NSView, когда первый перемещается через второй - PullRequest
0 голосов
/ 23 августа 2009

У меня есть подкласс NSView, который можно перетаскивать в его суперпредставлении. Я перемещаю представления, вызывая методы NSF setFrameOrigin и setFrameRotation в моем обработчике события mouseDragged. Представления перемещаются и поворачиваются при каждом вызове.

У меня есть несколько экземпляров этих представлений, содержащихся в одном суперпредставлении. Проблема, с которой я столкнулся, заключается в том, что, когда одно представление перетаскивается поверх другого, оно оставляет артефакты в представлении, которое затмевает. Я записал короткое видео об этом в действии. К сожалению, из-за сжатия видео артефакты не очень заметны.

Я сильно подозреваю, что это связано с синхронным переводом и вращением. Quartz Debug показывает, что прямоугольник окклюзионного (или окклюзионного) вида обновляется при перетаскивании другого вида ( видео здесь ); каким-то образом этот прямоугольник неправильно просчитывается механизмом рисования, поэтому часть вида, которая должна быть перерисована, не является.

Кикер, я понятия не имею, как это исправить. Я не могу найти способ вручную указать прямоугольник обновления в документах, и я не уверен, что это должно произойти. Есть идеи? Спасибо!

Ответы [ 2 ]

1 голос
/ 23 августа 2009

Вы можете также рассмотреть возможность использования CALayers вместо представлений. В отличие от представлений слои предназначены для объединения со своими братьями и сестрами.

Для возможного решения с наименьшими усилиями попробуйте сделать представления на основе слоев; это может или не может решить эту проблему, но стоит попробовать.

0 голосов
/ 23 августа 2009

Представления на самом деле не предназначены для объединения в интерактивном режиме. Можно сделать, но крайних случаев предостаточно.

Как правило, для такого рода вещей вы использовали бы инфраструктуру, подобную ячейке, если вы хотите выполнять перетаскивание в окне (см. Пример Sketch), и вы использовали бы инфраструктуру перетаскивания, если вы хотите перетаскивать между видами или окна (или приложения).

Если вы действительно хотите перетащить трансформированный вид поверх, вам нужно сделать недействительным прямоугольник вида под перетаскиваемым видом. Прямоугольник должен быть больше на несколько пикселей, чем общая площадь (не повернутая / не преобразованная), которая скрыта перетаскиваемым видом. Фактически, артефакты вызваны ошибкой округления; диагональные линии - это всего лишь приблизительная оценка в системе растрового изображения.

См. Метод:

- (void)setNeedsDisplayInRect:(NSRect)invalidRect;
...