2009-11-24 3 views
1

마침내 저는 UITextView/UIWebView 내부에 마스크 텍스트에 대한 방법/구현을 찾기 위해 시간을 할애했습니다. 일부 사용자 지정 배경 를 추가 - - 텍스트 와 uitextview /있는 UIWebView를 추가 - (피복 PNG로)가있는 UIImageView를 추가하거나 에 CAGradientLayer은 (간단한 마스크 효과를 만들 : 지금 내가 할 수 있어요 무엇으로 입니다 *) 물론 이것은 마법의 탄환이 아니며 최소한 하나 이상의 레이어 (*가 지적 된 레이어)를 필요로합니다. 배경을 모두 투명하게 볼 수 없으므로 누구나 여분의보기/레이어를 인식 할 수 있으므로 텍스트가 희미 해집니다. Google에서 검색했지만 여전히 좋은 해결책을 찾지 못했습니다 (나는 이미지를 마스크에 대해 발견했습니다.) ... 팁이 있습니까? 미리 감사드립니다. marcio마스크 텍스트가 uitextview/uiwebview 내에 있습니다.

추신 : 아마도 더 간단 할 것입니다. 여기 있습니다! http://grab.by/KzS

답변

1

예! 나는 그것을 마침내 얻었다. 나는 그것이 애플의 방법인지는 모르지만 작동한다. 어쩌면 그들은 개인 api를 사용할 기회가있을 것입니다.

1))

3 CGImageCreateWithImageInRect

자르기) 원하는 RECT를 창

2의 스크린 샷을 얻을 그라데이션 마스크를 적용 : 어쨌든 이것은 내가 그것을 가지고 방법에 대한 의사 알고리즘의 일종 작품입니다 나는 또한 가장 낮은 장치의 성능에 영향을주지 않습니다 주목

새롭게 생성 된 이미지와 함께있는 UIImageView를 만들 수)

4 (반사에 애플의 샘플 코드에서 도난). 도움이 되길 바랍니다. 그리고 이것은 결과의 작물입니다 (link text)

나는 그것을 더 좋게 만들기 위해 카테고리를 구현하기로 약속했습니다. 지금까지 코드는 다른 클래스에 널리 퍼져 있습니다. 샘플을 만들면 (가로 방향 만 지원됩니다. 아래 변형을 참조하십시오. 상단 마스크 만 지원됨). 이 경우 나는 마스크 될 필요가있는 테이블의 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 뒤에 다른 UITextView를 표시 할 수 있습니다 ... [here] (http://stackoverflow.com/questions/5469865/how-to) -crop-an-uitextview). 어쨌든 UITextView를 자르는 방법을 알고 있습니까? 제안이 있으면 매우 감사 할 것입니다. –

관련 문제