как затемнить UIImageView - PullRequest
       23

как затемнить UIImageView

6 голосов
/ 24 октября 2010

Мне нужно затемнить UIImageView, когда он прикасается, почти точно так же, как значки на трамплине (домашний экран).

Должен ли я добавить UIView с альфа-черным фоном 0,5,Это кажется неуклюжим.Должен ли я использовать слои или что-то (CALayers).

Ответы [ 3 ]

6 голосов
/ 25 августа 2012

Я бы позволил UIImageView обработать фактический рисунок изображения, но переключил изображение на изображение, которое было затемнено заранее.Вот некоторый код, который я использовал для генерации затемненных изображений с поддержкой альфа:

+ (UIImage *)darkenImage:(UIImage *)image toLevel:(CGFloat)level
{
    // Create a temporary view to act as a darkening layer
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    UIView *tempView = [[UIView alloc] initWithFrame:frame];
    tempView.backgroundColor = [UIColor blackColor];
    tempView.alpha = level;

    // Draw the image into a new graphics context
    UIGraphicsBeginImageContext(frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [image drawInRect:frame];

    // Flip the context vertically so we can draw the dark layer via a mask that
    // aligns with the image's alpha pixels (Quartz uses flipped coordinates)
    CGContextTranslateCTM(context, 0, frame.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextClipToMask(context, frame, image.CGImage);
    [tempView.layer renderInContext:context];

    // Produce a new image from this context
    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    UIImage *toReturn = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    UIGraphicsEndImageContext();
    [tempView release];
    return toReturn;
}
4 голосов
/ 24 октября 2010

Как насчет создания подкласса UIView и добавления UIImage ivar (называемого image)?Затем вы можете переопределить -drawRect: что-то вроде этого, при условии, что у вас есть булевский ивар с именем press, который был установлен во время касания.

- (void)drawRect:(CGRect)rect
{
[image drawAtPoint:(CGPointMake(0.0, 0.0))];

// if pressed, fill rect with dark translucent color
if (pressed)
    {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);
    CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 0.5);
    CGContextFillRect(ctx, rect);
    CGContextRestoreGState(ctx);
    }
}

Вы можете поэкспериментировать со значениями RGBA выше.И, конечно же, непрямоугольные формы потребуют немного больше работы - как CGMutablePathRef.

1 голос
/ 24 октября 2010

UIImageView может иметь несколько изображений;Вы можете иметь две версии изображения и при необходимости переключаться на более темную.

...