UIImage не прозрачный - PullRequest
8 голосов
/ 28 июля 2011

Я пытаюсь создать вид, который позволяет пользователю рисовать пальцем. У меня есть PNG в Pixelmator кисти. Мой метод drawRect: выглядит следующим образом:

- (void)drawRect:(CGRect)rect
{

    NSAssert(brush != nil, @"");

    for (UITouch *touch in touchesNeedingDrawing)
    {
        //Draw the touch
        [brush drawInRect:CGRectWithPoints([touch locationInView:self], [touch previousLocationInView:self]) blendMode:0 alpha:1];
    }

    [touchesNeedingDrawing removeAllObjects];
}

Изображение кисти представляет собой png с прозрачностью, но при запуске приложения прозрачность отсутствует. Кто-нибудь знает почему и как это исправить?

Edit: Я обнаружил, что изображение прозрачное, но когда я вызываю drawInRect, изображение рисует прозрачные пиксели как цвет фона представления. Есть ли CGBlendMode, который я могу использовать, чтобы это исправить?

Ответы [ 6 ]

4 голосов
/ 05 августа 2011

Решение очень простое, тестирует на моем собственном проекте. В классе, который вы обновили с помощью пользовательского - (void)drawRect:(CGRect)rect, установленного в -(id)init цвет фона для себя

[self setBackgroundColor:[UIColor clearColor]];

И это все. Проверено на моем проекте.

1 голос
/ 02 августа 2011

Похоже, что он принимает текущий цвет заливки контекста.

Попробуйте установить цвет заливки для контекста с помощью CGContextSetFillColorWithColor () в [UIColor clearColor] .CGColor

Если это не сработает, единственное другое решение, которое является простым и не должно иметь снижения производительности, - это иметь 2 представления:

  • Вид фона - это будет вид с правильным цветом фона или изображением
  • Вид наложения - этот вид обнаружит прикосновения и т. Д., А затем нарисует все мазки кисти сверху. Цвет фона этого вида может быть [UIColor clearColor], поэтому при рисовании изображений кисти альфа будет заполнена [UIColor clearColor]. По сути, то же самое, что и сейчас, только с четким фоном.

Примечание. Вам не нужно возиться с режимом наложения, чтобы это работало. Вы должны иметь возможность использовать по умолчанию drawInRect: метод

0 голосов
/ 07 августа 2011

Ваша проблема - фундаментальное заблуждение о том, как на самом деле работает drawRect:.Каждый раз, когда вы рисуете что-то в текущем графическом контексте, все, что было там ранее, будет очищено (так что останется только backgroundColor).

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

У вас есть два варианта решения этой проблемы:

1) Сохраняйте все штрихи, которые способствуют рисованию (не очищайте массив touchesNeedingDrawing) и перерисовывайте их каждый раз - это будет легко, но довольно медленно.

2) Рисовать в какой-нибудь буфер (например, UIImage, используя UIGraphicsBeginImageContext и т. Д.).Каждый раз, когда ваш рисунок меняется, создайте новый буфер.Нарисуйте старый буфер в новый буфер и изображения для нового штриха поверх него.

0 голосов
/ 06 августа 2011

Возможная проблема заключается в том, что вы устанавливаете blendMode в 0. Я предлагаю использовать метод -drawInRect: без режима наложения.Проблема также может заключаться в том, что ваше мнение имеет черный фон, но это сомнительно.Я также предложил бы попытаться отобразить UIImage в UIImageView в качестве теста.Возможно, проблема связана с тем, как PixelMator экспортирует изображения.

0 голосов
/ 05 августа 2011

Я думаю, вам стоит попробовать режим смешивания: kCGBlendModeDestinationOut.

Вы также можете рисовать в точке вместо рисования в прямоугольнике:

[brush drawAtPoint:[touch locationInView:self] blendMode:kCGBlendModeDestinationOut alpha:1]
0 голосов
/ 28 июля 2011

Загружается ли кисть png в imageView? То есть переменная brush является объектом UIImageView, не так ли? Если это так, возможно, просто

brush.backgroundColor = [UIColor clearColor];

поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...