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 пробивается отверстие.
Вот снимок экрана с результатом: