1

UIImageView を使用せずに UIImage の反射を作成する方法は? 2 つの imageView を使用してリフレクション用のアップル コードを見たことがありますが、アプリケーションに imageview を追加したくありません。元のイメージと反射されたイメージのイメージ全体が必要です。体はそれを行う方法を知っていますか。

4

3 に答える 3

1

少し前に、ビューの CAReplicatorLayer を使用するブログ投稿を書きました。これは、リフレクションを使用してビューへのダイナミクスの更新を処理するために設計されていますが、やりたいことにも役立つと思います。

于 2012-09-20T11:53:04.483 に答える
1

これは、 Nick Lockwoodによって作成された UIImage+FX.m からのものです。

UIImage * processedImage = //here your image
processedImage = [processedImage imageWithReflectionWithScale:0.15f
                                                                          gap:10.0f
                                                                        alpha:0.305f];

Scale は反射のサイズ、gap は画像と反射の間の距離、alpha は反射のアルファです。

- (UIImage *)imageWithReflectionWithScale:(CGFloat)scale gap:(CGFloat)gap alpha:(CGFloat)alpha
{
    //get reflected image
    UIImage *reflection = [self reflectedImageWithScale:scale];
    CGFloat reflectionOffset = reflection.size.height + gap;

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width, self.size.height + reflectionOffset * 2.0f), NO, 0.0f);

    //draw reflection
    [reflection drawAtPoint:CGPointMake(0.0f, reflectionOffset + self.size.height + gap) blendMode:kCGBlendModeNormal alpha:alpha];

    //draw image
    [self drawAtPoint:CGPointMake(0.0f, reflectionOffset)];

    //capture resultant image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return image
    return image;
}

- (UIImage *)reflectedImageWithScale:(CGFloat)scale
{
    //get reflection dimensions
    CGFloat height = ceil(self.size.height * scale);
    CGSize size = CGSizeMake(self.size.width, height);
    CGRect bounds = CGRectMake(0.0f, 0.0f, size.width, size.height);

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    //clip to gradient
    CGContextClipToMask(context, bounds, [[self class] gradientMask]);

    //draw reflected image
    CGContextScaleCTM(context, 1.0f, -1.0f);
    CGContextTranslateCTM(context, 0.0f, -self.size.height);
    [self drawInRect:CGRectMake(0.0f, 0.0f, self.size.width, self.size.height)];

    //capture resultant image
    UIImage *reflection = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return reflection image
    return reflection;
}

勾配マスク

+ (CGImageRef)gradientMask
{
    static CGImageRef sharedMask = NULL;
    if (sharedMask == NULL)
    {
        //create gradient mask
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 256), YES, 0.0);
        CGContextRef gradientContext = UIGraphicsGetCurrentContext();
        CGFloat colors[] = {0.0, 1.0, 1.0, 1.0};
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
        CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2);
        CGPoint gradientStartPoint = CGPointMake(0, 0);
        CGPoint gradientEndPoint = CGPointMake(0, 256);
        CGContextDrawLinearGradient(gradientContext, gradient, gradientStartPoint,
                                    gradientEndPoint, kCGGradientDrawsAfterEndLocation);
        sharedMask = CGBitmapContextCreateImage(gradientContext);
        CGGradientRelease(gradient);
        CGColorSpaceRelease(colorSpace);
        UIGraphicsEndImageContext();
    }
    return sharedMask;
}

反射のある画像を返します。

于 2012-09-20T11:55:04.810 に答える
0

グラフィックス コンテキスト内でイメージとその反射をレンダリングし、CGImageコンテキストから を取得し、そこから再び を取得できUIImageます。しかし問題は、なぜ 2 つのビューを使用しないのかということです。なぜそれが問題または制限だと思いますか?

于 2012-09-20T11:44:59.650 に答える