2014-08-28 73 views
3

我試圖通過文本使背景可見。這是一個例子。iOS:通過文本顯示背景的透明文本

background color showing thru text

我做了工作,使用下面的代碼。

- (UIImage *)maskImage:(UIImage *)image withMask:(CGImageRef)maskRef { 
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef maskedImageRef = CGImageCreateWithMask([image CGImage], mask); 
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef]; 

    CGImageRelease(mask); 
    CGImageRelease(maskedImageRef); 

    // returns new image with mask applied 
    return maskedImage; 
} 

- (void)setImageForView:(UIImageView *)imageView withText:(NSString *)text { 
    NSDictionary *attributes = @{ NSFontAttributeName: [UIFont fontWithName:@"Helvetica-Neue" size:45], NSForegroundColorAttributeName: [UIColor whiteColor], NSBackgroundColorAttributeName: [UIColor blackColor] }; 
    CGSize size = [text sizeWithAttributes:attributes]; 

    CGPoint center = imageView.center; 
    imageView.frame = CGRectMake(0, 0, size.width + 10, 41); 
    imageView.center = center; 
    UIGraphicsBeginImageContext(imageView.bounds.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Draw a dark gray background 
    CGRect rect = imageView.bounds; 
    CGContextFillRect(context, rect); 

    // Draw the text upside-down 
    CGContextSaveGState(context); 

    CGContextSetInterpolationQuality(context , kCGInterpolationHigh); 
    [text drawInRect:CGRectMake((rect.size.width - size.width)/2, (rect.size.height - size.height)/2, size.width, size.height) withAttributes:attributes]; 
    CGContextRestoreGState(context); 

    // Create an image mask from what we've drawn so far 
    CGImageRef alphaMask = CGBitmapContextCreateImage(context); 
    UIGraphicsEndImageContext(); 

    imageView.image = [self maskImage:[UIImage imageNamed:@"white"] withMask:alphaMask]; 
} 

它幾乎工作,但因爲它使用呈現的文本作爲掩模,它似乎失去了抗鋸齒效果在這個例子中。

aliased edges

我不知道是否有一種方式來獲得像第一個圖像的結果。任何幫助,將不勝感激。

回答

0

您是否在設置文字顏色時考慮過使用Alpha值? UIColor和CGColor都允許使用alpha值來設置文本的透明度。

例如,你可以使用類似

yourTextColor = [UIColor colorWithWhite:0 alpha:0.5].CGColor; //remove the ".CGColor" if you are using UIColor 

這將創建一個半透明的淡灰色的顏色。如果你想要特定的顏色,UIColor還有一個設置RGBA值的方法。

看看你的圖片,我會建議在0.85-0.95範圍內的阿爾法值。

希望這會有所幫助。

編輯:進一步看你的代碼,當你開始imageContext時,可能有一種可能性是你沒有提供視網膜顯示屏幕。與此塊

UIGraphicsBeginImageContext(imageView.bounds.size); 

:我會建議更換這一說法

if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))//retina-display 
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 0.0); 
else //non-retina display 
    UIGraphicsBeginImageContext(imageView.bounds.size); 
+0

謝謝,但改變文本的Alpha值不給,我需要同樣的效果。我想通過背景清楚地顯示背景。我認爲我的解決方案完全不同於這種方法。我將用我很快找到的解決方案進行更新。 – Todd 2014-08-31 04:39:17