Градиенты на UIView и UILabels на iPhone [дубликат]


Возможные Дубликаты:
рисование градиента вручную в приложениях iPhone?

мой приложение должно отображать текст в UIView или UILabel но задняя земля должна быть градиентом, а не истинным UIColor. Использование графической программы для создания желаемого внешнего вида не очень хорошо, так как текст может варьироваться в зависимости от данных, возвращаемых с сервера.

кто-нибудь знает самый быстрый способ решить эту проблему? Ваши мысли очень важны оцененный.

7 218

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 ' s backgroundColor to что вам нравится, и этот блеск будет нарисован поверх этого цвета. Вы также можете нарисовать радиальный градиент с помощью .

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

EDIT (4/23/2009): по предложению St3fan Я заменил рамку представления его границами в коде. Это исправляет для случая, когда начало представления не (0,0).

при использовании CAGradientLayer, а не CGGradient, градиент не является гладким, но имеет заметный шаг к нему. Смотрите this example:

для получения более привлекательных результатов лучше использовать 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, вы можете иметь несколько вариантов, будет ли ваш рисунок ниже или выше градиента...