Градиенты на UIView и UILabels на iPhone [дубликат]
Возможные Дубликаты:
рисование градиента вручную в приложениях iPhone?
мой приложение должно отображать текст в UIView
или UILabel
но задняя земля должна быть градиентом, а не истинным UIColor
. Использование графической программы для создания желаемого внешнего вида не очень хорошо, так как текст может варьироваться в зависимости от данных, возвращаемых с сервера.
кто-нибудь знает самый быстрый способ решить эту проблему? Ваши мысли очень важны оцененный.
7 ответов:
вы также можете использовать графическое изображение шириной в один пиксель в качестве градиента и установить свойство view для расширения графики для заполнения вида (предполагая, что вы думаете о простом линейном градиенте, а не о какой-то радиальной графике).
Я понимаю, что это старый нить, но на будущее:
начиная с iPhone SDK 3.0, пользовательские градиенты могут быть реализованы очень легко, без подклассов или изображений, с помощью нового
CAGradientLayer
:UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = view.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil]; [view.layer insertSublayer:gradient atIndex:0];
взгляните на документы CAGradientLayer. Вы можете дополнительно указать начальную и конечную точки (в случае, если вы не хотите линейный градиент, который идет прямо сверху вниз), или даже определенные местоположения, которые сопоставляются с каждым из цветов.
вы можете использовать основную графику для рисования градиента, как указано в ответе Майка. В качестве более подробного примера можно создать
UIView
подкласс для использования в качестве фона для вашегоUILabel
. В этомUIView
подклассе переопределитьdrawRect:
метод и вставить код, подобный следующему:- (void)drawRect:(CGRect)rect { CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGGradientRef glossGradient; CGColorSpaceRef rgbColorspace; size_t num_locations = 2; CGFloat locations[2] = { 0.0, 1.0 }; CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35, // Start color 1.0, 1.0, 1.0, 0.06 }; // End color rgbColorspace = CGColorSpaceCreateDeviceRGB(); glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); CGRect currentBounds = self.bounds; CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f); CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)); CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0); CGGradientRelease(glossGradient); CGColorSpaceRelease(rgbColorspace); }
этот конкретный пример создает белый, глянцевый стиль градиента, который рисуется из верхней части
UIView
по его вертикальной оси. Вы можете установитьUIView
' sbackgroundColor
to что вам нравится, и этот блеск будет нарисован поверх этого цвета. Вы также можете нарисовать радиальный градиент с помощью .вам просто нужно размер это
UIView
надлежащим образом и добавитьUILabel
в качестве подвида его, чтобы получить желаемый эффект.EDIT (4/23/2009): по предложению St3fan Я заменил рамку представления его границами в коде. Это исправляет для случая, когда начало представления не (0,0).
при использовании
CAGradientLayer
, а неCGGradient
, градиент не является гладким, но имеет заметный шаг к нему. Смотрите :для получения более привлекательных результатов лучше использовать
CGGradient
.
ответ Мирко Фролиха работал для меня, за исключением тех случаев, когда я хотел использовать пользовательские цвета. Хитрость заключается в том, чтобы указать цвет пользовательского интерфейса с оттенком, насыщенностью и яркостью вместо RGB.
CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = myView.bounds; UIColor *startColour = [UIColor colorWithHue:.580555 saturation:0.31 brightness:0.90 alpha:1.0]; UIColor *endColour = [UIColor colorWithHue:.58333 saturation:0.50 brightness:0.62 alpha:1.0]; gradient.colors = [NSArray arrayWithObjects:(id)[startColour CGColor], (id)[endColour CGColor], nil]; [myView.layer insertSublayer:gradient atIndex:0];
чтобы получить оттенок, насыщенность и яркость цвета, используйте встроенный выбор цвета xcode и перейдите на вкладку HSB. Оттенок измеряется в градусах в этом представлении, поэтому разделите значение на 360, чтобы получить значение, которое вы хотите ввести в коде.
Это то, что я получил рабочий набор UIButton в IB xCode для прозрачного/ясного и без изображения bg.
UIColor *pinkDarkOp = [UIColor colorWithRed:0.9f green:0.53f blue:0.69f alpha:1.0]; UIColor *pinkLightOp = [UIColor colorWithRed:0.79f green:0.45f blue:0.57f alpha:1.0]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = [[shareWordButton layer] bounds]; gradient.cornerRadius = 7; gradient.colors = [NSArray arrayWithObjects: (id)pinkDarkOp.CGColor, (id)pinkLightOp.CGColor, nil]; gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:0.7], nil]; [[recordButton layer] insertSublayer:gradient atIndex:0];
Я достигаю этого в представлении с подвидом, который является UIImageView. Изображение, на которое указывает ImageView, является градиентом. Затем я устанавливаю цвет фона в UIView, и у меня есть цветной градиентный вид. Затем я использую вид, как мне нужно, и все, что я рисую, будет под этим градиентным видом. Добавляя второй вид поверх ImageView, вы можете иметь несколько вариантов, будет ли ваш рисунок ниже или выше градиента...