2011-08-09 19 views
7

Kullanarak metin için degrade dolgusu oluşturma Metnimin dolgu rengi için bir degrade oluşturmak istiyorum. Şu anda[UIColor colorWithPatternImage:]

üzerine boyanmış bir düzlem madde ile basit bir resim dosyası olduğu
UIImage *image = [UIImage imageNamed:@"GradientFillImage.png"]; 
myLabel.textColor = [UIColor colorWithPatternImage:image]; 

olarak UILabel metninin rengini ayarlayarak bunu yapıyorum.

Yazı tipini yeniden boyutlandırmak istediğim kadar iyi çalışıyor. Resim dosyası sabit boyutlarda olduğundan ve yazı tipini yeniden boyutlandırdığımda yeniden boyutlandırılmadığı için yazı tipi için degrade dolgulu olur. Özel boyutlu desen görüntüsünü nasıl oluşturabilirim ve metin için dolgu deseni olarak nasıl uygularım?

cevap

2

Tamam, anladım. Temel olarak, drawRectInText'u geçersiz kılabilir ve dolguyu renklendirmek için kendi desenimizi kullanabiliriz. Bunu yapmanın avantajı, görüntüyü desen çerçevemize yeniden boyutlandırabilmemizdir.

Önce bir CGPattern nesnesi oluşturuyoruz ve deseni çizmek için bir geri arama tanımlıyoruz. Ayrıca etiketin boyutunu geri aramada bir parametre olarak geçiriyoruz.

- (void)drawTextInRect:(CGRect)rect 
{ 
    //set gradient as a pattern fill 
    CGRect info[1] = {rect}; 
    static const CGPatternCallbacks callbacks = {0, &drawImagePattern, NULL}; 
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0, -1.0); 

    CGPatternRef pattern = CGPatternCreate((void *) info, rect, transform, 10.0, rect.size.height, kCGPatternTilingConstantSpacing, true, &callbacks); 
    CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL); 
    CGFloat alpha = 1.0; 
    CGColorRef patternColorRef = CGColorCreateWithPattern(patternSpace, pattern, &alpha); 
    CGColorSpaceRelease(patternSpace); 
    CGPatternRelease(pattern); 
    self.textColor = [UIColor colorWithCGColor:patternColorRef]; 
    self.shadowOffset = CGSizeZero; 
    [super drawTextInRect:rect]; 
} 

geri arama bağlamı içine görüntü çizen: Daha sonra metnin dolgu rengi olarak callback'inde çizilmiş ve ayarlanır desen kullanın. Görüntü, geri aramaya iletilen çerçeve boyutuna göre yeniden boyutlandırılır.

void drawImagePattern(void *info, CGContextRef context) 
{ 
    UIImage *image = [UIImage imageNamed:@"FontGradientPink.png"]; 
    CGImageRef imageRef = [image CGImage]; 
    CGRect *rect = info; 
    CGContextDrawImage(context, rect[0], imageRef); 
} 
4

UIColor sınıfı bir uzantıyı yeni bitirdim, bu da bunu 1 satırlık + blok bir şey yapıyor.

https://github.com/bigkm/UIColor-BlockPattern

CGRect rect = CGRectMake(0.0,0.0,10.0,10.0); 

[UIColor colorPatternWithSize:rect.size andDrawingBlock:[[^(CGContextRef c) { 
    UIImage *image = [UIImage imageNamed:@"FontGradientPink.png"]; 
    CGContextDrawImage(context, rect, [image CGImage]); 
} copy] autorelease]]; 
+0

İyi iş @bigkm. Bu kesinlikle bazı dağınık kod etrafında sarıcı kullanımı kolay ekler. – windson

İlgili konular