iphone - 如何在反射 UIImageView (带有变化的图片)时摆脱以前的反射?

标签 iphone reflection uiimageview

我已成功使用苹果的反射示例应用程序从 UIImageView 创建反射。

问题是,当我更改 UIImageView 内的图片时,先前显示的图片的反射仍保留在屏幕上。下一张图片上的新反射会与前一个反射重叠。

如何确保切换到下一张图片时消除上一张倒影?

非常感谢。我希望我的问题不是太基本。

这是我迄今为止使用过的代码:

// reflection
self.view.autoresizesSubviews = YES;
self.view.userInteractionEnabled = YES;


// create the reflection view
CGRect reflectionRect = currentView.frame;

// the reflection is a fraction of the size of the view being reflected
reflectionRect.size.height = reflectionRect.size.height * kDefaultReflectionFraction;

// and is offset to be at the bottom of the view being reflected
reflectionRect = CGRectOffset(reflectionRect, 0, currentView.frame.size.height);

reflectionView = [[UIImageView alloc] initWithFrame:reflectionRect];

// determine the size of the reflection to create
NSUInteger reflectionHeight = currentView.bounds.size.height * kDefaultReflectionFraction;

// create the reflection image, assign it to the UIImageView and add the image view to the containerView
reflectionView.image = [self reflectedImage:currentView withHeight:reflectionHeight];
reflectionView.alpha = kDefaultReflectionOpacity;
[self.view addSubview:reflectionView];

然后使用下面的代码来形成反射:

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(nil, 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 gradientEndPoint = CGPointMake(0, pixelsHigh);

    // 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 (nil, pixelsWide, pixelsHigh, 8,
                                                        0, colorSpace,
                                                        // this will give us an optimal BGRA format for the device:
                                                        (kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst));
CGColorSpaceRelease(colorSpace);

    return bitmapContext;
}

- (UIImage *)reflectedImage:(UIImageView *)fromImage withHeight:(NSUInteger)height
{
    if (!height) return nil;

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

    // offset the context -
    // This is necessary because, by default, the layer created by a view for caching its content is flipped.
    // But when you actually access the layer content and have it rendered it is inverted.  Since we're only creating
    // a context the size of our reflection view (a fraction of the size of the main view) we have to translate the
    // context the delta in size, and render it.
    //
    CGFloat translateVertical= fromImage.bounds.size.height - height;
    CGContextTranslateCTM(mainViewContentContext, 0, -translateVertical);

    // render the layer into the bitmap context
    CALayer *layer = fromImage.layer;
    [layer renderInContext:mainViewContentContext];

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

    // 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(1, height);

    // 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
    CGImageRef reflectionImage = CGImageCreateWithMask(mainViewContentBitmapContext, gradientMaskImage);
    CGImageRelease(mainViewContentBitmapContext);
    CGImageRelease(gradientMaskImage);

    // 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;
}

最佳答案

如果您不想使用IB,只需添加

reflectionView.image = nil;

之前

reflectedImage.image = [self reflectedImage:...

不要忘记这一行

if (currentView.image == nil) reflectedImage.image = nil;

否则图像消失后,您将得到旧的倒影。

关于iphone - 如何在反射 UIImageView (带有变化的图片)时摆脱以前的反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2396454/

相关文章:

iphone - IOS 5.0 及更高版本中的 UITextView 中不显示文本

iphone - 通过(常见)网络摄像头/iPhone/Android 增强现实 - 网格检测? - 哈利波特 3D 示例

java - 检测对象是否存储状态或是否可以共享

ios - 如何为每个注释显示不同的左侧附件图像?

ios - 使用图像动态调整表格 View 单元格的大小

iphone - 当电话或其他事件关闭音乐播放器 iPhone 时捕捉事件

ios - 如何在 Swift 中打印 Unicode 字符

c# - 在运行时创建数组类型

c# - 使 DynamicMethod 调用其他方法

ios4 - 正确发布UIImagePickerController