(Пропустить вниз для полного исходного кода)
Действительно полезные ответы и Брэда Ларсона, и Баха. Второй работал для меня, но для этого требуется, чтобы изображение присутствовало заранее. Я хотел что-то более динамичное, поэтому я объединил оба решения в один:
Результат работает, и на скриншоте ниже вы можете увидеть некоторые греческие символы, сделанные отлично. (Я также добавил штрих и тень поверх градиента).
[/g2]
Вот специальный метод инициализации моей метки вместе с методом, который делает градиент на UIImage (часть кода для этой функциональности, которую я получил из сообщения в блоге, я не могу найти сейчас, чтобы ссылаться на нее):
- (id)initWithFrame:(CGRect)frame text:(NSString *)aText {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor clearColor];
self.text = aText;
self.textColor = [UIColor colorWithPatternImage:[self gradientImage]];
}
return self;
}
- (UIImage *)gradientImage
{
CGSize textSize = [self.text sizeWithFont:self.font];
CGFloat width = textSize.width; // max 1024 due to Core Graphics limitations
CGFloat height = textSize.height; // max 1024 due to Core Graphics limitations
// create a new bitmap image context
UIGraphicsBeginImageContext(CGSizeMake(width, height));
// get context
CGContextRef context = UIGraphicsGetCurrentContext();
// push context to make it current (need to do this manually because we are not drawing in a UIView)
UIGraphicsPushContext(context);
//draw gradient
CGGradientRef glossGradient;
CGColorSpaceRef rgbColorspace;
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 0.0, 1.0, 1.0, 1.0, // Start color
1.0, 1.0, 0.0, 1.0 }; // End color
rgbColorspace = CGColorSpaceCreateDeviceRGB();
glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
CGPoint topCenter = CGPointMake(0, 0);
CGPoint bottomCenter = CGPointMake(0, textSize.height);
CGContextDrawLinearGradient(context, glossGradient, topCenter, bottomCenter, 0);
CGGradientRelease(glossGradient);
CGColorSpaceRelease(rgbColorspace);
// pop context
UIGraphicsPopContext();
// get a UIImage from the image context
UIImage *gradientImage = UIGraphicsGetImageFromCurrentImageContext();
// clean up drawing environment
UIGraphicsEndImageContext();
return gradientImage;
}
Я попытаюсь завершить этот подкласс UILabel и опубликовать его.
EDIT:
Класс выполнен, и он находится в моем хранилище GitHub . Читайте об этом здесь !
В некоторых терминалах (среди прочего, Git Bash) вы можете дважды щелкнуть любую строку * (здесь, длинный путь к файлу, но это может быть имя ветви или что-то еще), и она будет выбрана и скопирована.
После этого вам просто нужно щелкнуть правой кнопкой мыши, чтобы вставить его туда, где находится ваш курсор. Очень удобно, когда доступно.
* (очень распространенный сценарий: когда вы выполняете «добавление», как правило, вы просто перед этим делали «статус» и отображаете измененные файлы)