#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. В итоге все оказалось невероятно просто. Мне потребовалось некоторое время, чтобы понять, что мне нужно нарисовать безье после того, как я установил тень. Спасибо за потрясающий ответ!