[ TLDR: Использование Model-View-Controller .]
Здесь необходимо учитывать три различных момента:
- «Идеальное» изображение, которое рисует пользователь, сетка из 16x16 (или сколько угодно) цветных пикселей.
- Экранное представление, где каждый пиксель отображается в гораздо большем размере, чтобы пользователь мог взаимодействовать с ним..
- Конечный файл изображения, экспортируемый из приложения.
Хранение этих элементов отдельно в вашем уме, и ваша реализация сделает вашу жизнь lot проще.
# 1 - это модель , и в этом случае она, вероятно, будет состоять из массива из 256 (или сколько угодно) цветовых значений, возможно, наряду с некоторыми описательными данными, такими как размеры в пикселях и цветовое пространство,Для чего-то такого простого вы могли бы не хотеть создавать отдельный класс модели (хотя вы должны это делать), но даже если это просто массив ivar, сидящий в монолитном классе приложения, вы все равно должны думать о нем как об отдельной сущности
# 2 - это представление (с контроллером тенденциями), и вы почти наверняка должны реализовать его с помощью пользовательского подкласса NSView
.Было бы возможно построить сетку из 256 экземпляров NSColorWell
или другого существующего типа NSView
, но это было бы просто глупо .Представление имеет два задания:
- Нарисуйте модель на экране.Сделайте это, перебирая значения данных и рисуя каждое из них в виде заполненного прямоугольника соответствующего размера.Методы
NSBezierPath
здесь ваши друзья, особенно методы класса fillRect
и strokeRect
. - . Опосредовать ввод данных пользователем.Например, вы можете решить, что пользователь раскрасит пиксель, щелкнув по нему мышью.Вашему представлению будет отправлено событие для каждого щелчка мыши, и вам нужно будет ответить, сопоставив местоположение щелчка с правильным пикселем (в основном, делением), а затем внеся соответствующие изменения в модель.
# 3 - это в некотором роде просто другой вид, в том смысле, что это еще один способ представления модели.Код для его создания иногда включается в модель (скажем, если существует только один канонический способ сериализации данных), но рекомендуется размещать его где-то еще, особенно если позже вы захотите добавить другие произвольные механизмы.
Ключевым моментом здесь является то, что это изображение на самом деле не имеет ничего общего со стороной NSView
, это вопрос получения данных модели и их записи.Вы можете писать с помощью NSImage
методов или с помощью Core Graphics, как упомянуто в других ответах, но абсолютно не следует *1054* делать то, что вы пытаетесь вручную обработать с экрана.Так лежит безумие!