2009-11-24 31 views
1

終於我選擇花一些時間在UITextView/UIWebView中找到一種方式/實現 掩碼文本。 現在有什麼我可以做的是: - 添加一些自定義背景 - 添加一個UITextView/UIWebView的一些文字 - 添加的UIImageView(帶覆蓋PNG)或CAGradientLayer到 創建一個簡單的面膜效果( *) 當然,這不是一個神奇的子彈,並且至少需要一個以上的層(用*指出)。 此外,當您擁有完全透明的背景時,並不是那麼好,因爲每個人都可以識別用於 的額外視圖/圖層,從而淡化文本。 我在谷歌搜索了所有但仍然沒有找到一個很好的解決方案(我已經 發現關於面具的圖像,等等等等)... 任何提示? 在此先感謝, marciouitextview/uiwebview中的掩碼文本

PS也許一個截圖將更直接,在這裏你! http://grab.by/KzS

回答

1

是的!我終於明白了。我不知道這是蘋果的方式,但它的工作原理。也許他們有機會僱用一些私人apis。反正這是我得到了它一種僞算法的原理:

1)得到窗口

2的屏幕截圖)作物所需的矩形與CGImageCreateWithImageInRect

3)應用漸變面具(來自蘋果的示例代碼被盜的思考)

4)創建的UIImageView與新創建的圖像

我也注意到,它不會影響甚至在最低的器件性能。 希望它會有幫助! 這是一個結果作物(link text

我已經答應自己實現一個類別,只是爲了讓它變得更好。到目前爲止,代碼在不同的類中相當普遍。 只是爲了製作一個示例(僅支持橫向,請參閱下面的轉換,僅支持頂部蒙版)。在這種情況下,我overrided didMoveToWindow需要被掩蓋表:

- (void)didMoveToWindow { 
    if (self.window) { 

     UIImageView *reflected = (UIImageView *)[self.superview viewWithTag:TABLE_SHADOW_TOP]; 
     if (!reflected) { 
      UIImage *image = [UIImage screenshot:self.window]; 

      // 
      CGRect croppedRect = CGRectMake(480-self.frame.size.height, self.frame.origin.x, 16, self.frame.size.width); 
      CGImageRef cropImage = CGImageCreateWithImageInRect(image.CGImage, croppedRect); 
      UIImage *reflectedImage = [UIImage imageMaskedWithGradient:cropImage]; 
      CGImageRelease(cropImage); 

      UIImageView *reflected = [[UIImageView alloc] initWithImage:reflectedImage]; 
      reflected.transform = CGAffineTransformMakeRotation(-(M_PI/2)); 
      reflected.tag = TABLE_SHADOW_TOP; 
      CGRect adjusted = reflected.frame; 
      adjusted.origin = self.frame.origin; 
      reflected.frame = adjusted; 
      [self.superview addSubview:reflected]; 
      [reflected release]; 
     } 
    } 
} 

,這是UIImage的類別:

CGImageRef CreateGradientImage(int pixelsWide, int pixelsHigh) 
{ 
    CGImageRef theCGImage = NULL; 

    // gradient is always black-white and the mask must be in the gray colorspace 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    // create the bitmap context 
    CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh, 
                   8, 0, colorSpace, kCGImageAlphaNone); 

    // define the start and end grayscale values (with the alpha, even though 
    // our bitmap context doesn't support alpha the gradient requires it) 
    CGFloat colors[] = {0.0, 1.0, 1.0, 1.0}; 

    // create the CGGradient and then release the gray color space 
    CGGradientRef grayScaleGradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2); 
    CGColorSpaceRelease(colorSpace); 

    // create the start and end points for the gradient vector (straight down) 
    CGPoint gradientStartPoint = CGPointZero; 
    // CGPoint gradientStartPoint = CGPointMake(0, pixelsHigh); 
    CGPoint gradientEndPoint = CGPointMake(pixelsWide/1.75, 0); 

    // draw the gradient into the gray bitmap context 
    CGContextDrawLinearGradient(gradientBitmapContext, grayScaleGradient, gradientStartPoint, 
           gradientEndPoint, kCGGradientDrawsAfterEndLocation); 
    CGGradientRelease(grayScaleGradient); 

    // convert the context into a CGImageRef and release the context 
    theCGImage = CGBitmapContextCreateImage(gradientBitmapContext); 
    CGContextRelease(gradientBitmapContext); 

    // return the imageref containing the gradient 
    return theCGImage; 
} 

CGContextRef MyCreateBitmapContext(int pixelsWide, int pixelsHigh) 
{ 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    // create the bitmap context 
    CGContextRef bitmapContext = CGBitmapContextCreate (NULL, pixelsWide, pixelsHigh, 8, 
                 0, colorSpace, 
                 // this will give us an optimal BGRA format for the device: 
                 (kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst)); 
    CGColorSpaceRelease(colorSpace); 

    return bitmapContext; 
} 

+ (UIImage *)imageMaskedWithGradient:(CGImageRef)image { 

    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    DEBUG(@"need to support deviceOrientation: %i", deviceOrientation); 

    float width = CGImageGetWidth(image); 
    float height = CGImageGetHeight(image); 

    // create a bitmap graphics context the size of the image 
    CGContextRef mainViewContentContext = MyCreateBitmapContext(width, height); 

    // create a 2 bit CGImage containing a gradient that will be used for masking the 
    // main view content to create the 'fade' of the reflection. The CGImageCreateWithMask 
    // function will stretch the bitmap image as required, so we can create a 1 pixel wide gradient 
    CGImageRef gradientMaskImage = CreateGradientImage(width, 1); 

    // create an image by masking the bitmap of the mainView content with the gradient view 
    // then release the pre-masked content bitmap and the gradient bitmap 
    CGContextClipToMask(mainViewContentContext, CGRectMake(0.0, 0.0, width, height), gradientMaskImage); 
    CGImageRelease(gradientMaskImage); 

    // draw the image into the bitmap context 
    CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, width, height), image); 

    // create CGImageRef of the main view bitmap content, and then release that bitmap context 
    CGImageRef reflectionImage = CGBitmapContextCreateImage(mainViewContentContext); 
    CGContextRelease(mainViewContentContext); 

    // convert the finished reflection image to a UIImage 
    UIImage *theImage = [UIImage imageWithCGImage:reflectionImage]; 

    // image is retained by the property setting above, so we can release the original 
    CGImageRelease(reflectionImage); 

    return theImage; 

} 

希望它能幫助。

+0

感謝您分享。我正在嘗試做一些與你目前稍有不同的東西 - 裁剪一個UITextView,以便在它後面顯示另一個UITextView ...看到[這裏](http://stackoverflow.com/questions/5469865/how-to -crop-AN-UITextView的)。你知道,如何去裁剪UITextView?如果您有任何建議,我會非常感激! – 2011-03-29 10:29:47