Рисование поверх UIImageView, чтобы сделать изображение прозрачным - PullRequest
4 голосов
/ 26 декабря 2011

Я работаю над одним приложением для iPhone, в котором мне нужно сделать прозрачной часть изображения, установив его альфа-уровень на 0, когда пользователь перемещает палец вокруг изображения.По сути, если вам знакомо приложение iSteam из магазина приложений, пользователь должен иметь возможность перемещать палец по верхнему изображению, что сделает фоновое изображение прозрачным.

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

Есть идеи по этому поводу?И что я должен использовать для этого?Кварц или Open GL.Я новичок в разработке приложений для iPhone и совершенно не знаю об этих API, поэтому некоторые рекомендации экспертов, несомненно, помогут мне продвинуться в разработке iPhone SDK.

1 Ответ

3 голосов
/ 26 декабря 2011

UIImageView имеет слой, который вы можете называть его layer и с которым можно общаться, когда вы связываете свой проект с QuartzCore.Когда пользователь перемещает палец, обрезает четкую фигуру в графическом контексте с непрозрачным цветом того же размера, что и UIImageView, превращает его в CGImageRef, устанавливает его как CALayer's contents (снова этот CALayer должен быть таким жеsize as UIImageView) и установите этот слой как UIImageView's layer.mask.Везде, где маска прозрачна, это пробивает прозрачную дыру в слое, что означает вид, что означает изображение, которое показывает UIImageView.(Если это не сработает, поскольку UIImageView не нравится, когда вы вмешиваетесь в его слой, вы можете вместо этого использовать суперпредставление UIImageView.)

EDIT (на следующий день) - вот пример кода для слояделегат, который пробивает круглое отверстие в центре:

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)c {
    CGRect r = CGContextGetClipBoundingBox(c);
    CGRect r2 = CGRectInset(r, r.size.width/2.0 - 10, r.size.height/2.0 - 10);

    UIImage* maskim;
    {
        UIGraphicsBeginImageContextWithOptions(r.size, NO, 0);
        CGContextRef c = UIGraphicsGetCurrentContext();
        CGContextAddEllipseInRect(c, r2);
        CGContextAddRect(c, r);
        CGContextEOClip(c);
        CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);
        CGContextFillRect(c, r);
        maskim = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }

    CALayer* mask = [CALayer layer];
    mask.frame = r;
    mask.contents = (id)maskim.CGImage;
    layer.mask = mask;
}

Итак, если этот слой является слоем представления, и если UIImageView является подпредставлением этого представления, то в UIImageView пробивается отверстие.

Вот снимок экрана с результатом:

image with a hole punched in it

...