Кварцевые тени неправильно рисуются

#iphone #objective-c #cocoa-touch

#iPhone #objective-c #cocoa-touch

Вопрос:

Итак, у меня есть это изображение для моего приложения, которое выглядит следующим образом:

введите описание изображения здесь

Теперь это хорошо и все такое, но я пытаюсь уменьшить свою зависимость от изображений и вместо этого пытаюсь рисовать это динамически.

Итак, я обнаружил, что это изображение встроено в UIColor : (scrollViewTexturedBackgroundColor)

введите описание изображения здесь

Выглядит немного светлым, но приятным. Мы добираемся туда.

Итак, теперь я переопределяю drawRect в UIView подклассе, чтобы немного затемнить это.

 -(void)drawRect:(CGRect)rect {
    [[UIColor colorWithWhite:0.0 alpha:0.4] setFill];
    UIRectFillUsingBlendMode(rect , kCGBlendModeDarken);
}
  

Эй, это не идеально, но достаточно близко. Я всегда могу настроить режим наложения и цвет позже. Теперь начинается самое сложное. Я не могу понять, как заставить тени правильно рисовать. Например, я попытался настроить свою тень следующим образом:

введите описание изображения здесь

 CGContextSetShadowWithColor(ctx, CGSizeMake(0, 6), 5, [[UIColor blackColor]CGColor]);
  

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

Есть идеи?

Ответ №1:

Тень отображается с помощью чего-то, что нарисовано. Вы не можете нарисовать только тень без фактического объекта, который ее отбрасывает. Если вы найдете способ сделать это, пожалуйста, дайте мне знать.

Я вижу, что на первом рисунке вы используете эффект внутренней тени. Чтобы получить аналогичный результат, вам нужно нарисовать контур, который отбрасывает тень вокруг области.

введите описание изображения здесь

На картинке красный контур — это контур Безье с обводкой 10 пикселей. Я оставил пробел между изображением и контуром, чтобы показать, что контур больше фонового изображения. Для создания такого пути вы можете использовать путь Безье с rect . Вставьте прямоугольник фонового изображения на отрицательное значение, равное половине ширины штриха.

Если фактический контекст больше, чем изображение, обрежьте его прямоугольником изображения, прежде чем рисовать контур.

Комментарии:

1. Интересно, я посмотрю на это.

2. Крысы. Я действительно новичок в рисовании в Quartz и не могу понять, как нарисовать контур Безье. Любые предложения о том, как это сделать?

3. UIBezierPath довольно прост. Вы можете использовать [UIBezierPath bezierPathWithRect:] для построения пути и [path stroke] его рисования.

4. В итоге все оказалось невероятно просто. Мне потребовалось некоторое время, чтобы понять, что мне нужно нарисовать безье после того, как я установил тень. Спасибо за потрясающий ответ!