Angenommen, Ihr Bild wird in einer Ansicht angezeigt - wahrscheinlich eine UIImageView. Dann können wir ein rechteckiges Loch in dieser Ansicht durch maskieren die Ebene der Ansicht. Jede Ansicht hat eine Ebene. Wir werden auf die Ebene dieser Ansicht eine Maske anwenden, die selbst eine Ebene ist, die ein Bild enthält, das wir im Code erzeugen werden. Das Bild wird schwarz sein, bis auf ein klares Rechteck irgendwo in der Mitte. Dieses durchsichtige Rechteck verursacht das Loch in der Bildansicht.
Lassen Sie also self.iv
diese UIImageView sein. Versuchen Sie diesen Code ausführen:
CGRect r = self.iv.bounds;
CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired!
UIGraphicsBeginImageContextWithOptions(r.size, NO, 0);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextAddRect(c, r2);
CGContextAddRect(c, r);
CGContextEOClip(c);
CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);
CGContextFillRect(c, r);
UIImage* maskim = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CALayer* mask = [CALayer layer];
mask.frame = r;
mask.contents = (id)maskim.CGImage;
self.iv.layer.mask = mask;
Zum Beispiel in diesem Bild, das weiße Quadrat ist kein überlagerter Platz, es ist ein Loch ist, zeigt das Weiß des Fensterhintergrund dahinter:
EDIT: Ich fühle mich verpflichtet, da ich es in einem Kommentar erwähnt habe, um zu zeigen, wie man dasselbe mit einem CAShapeLayer macht. Das Ergebnis ist genau das gleiche:
CGRect r = self.iv.bounds;
CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired!
CAShapeLayer* lay = [CAShapeLayer layer];
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, nil, r2);
CGPathAddRect(path, nil, r);
lay.path = path;
CGPathRelease(path);
lay.fillRule = kCAFillRuleEvenOdd;
self.iv.layer.mask = lay;
Wollen Sie schneiden das Loch in der _image_ oder in der UIImageView einfügen, zeigt es? – matt
Schau dir an, wie ich ein kreisförmiges Loch in eine UIImageView (und sein Bild) in diesem Code stemple: http://Stackoverflow.com/a/8632731/341994 Du würdest genau dasselbe machen, außer dass du ein Quadrat statt einer zeichnen würdest Kreis. – matt
@matt: Schneiden ein Loch in der tatsächlichen UIImageView wäre eigentlich perfekt! Außer, ich weiß nicht, wie man den Code benutzt, den du verlinkt hast: p Was ist ein CLayer und CGContextRef? Danke !! – Phillip