2014-05-04 9 views
8

Ich versuche ein transparentes Quadrat in einem UIImage zu schneiden, aber ehrlich gesagt muss ich mir vorstellen, wo/wie ich anfangen soll.Wie kann ich ein transparentes Loch in einem UIIMage "schneiden"?

Jede Hilfe würde sehr geschätzt werden.

Danke!

+1

Wollen Sie schneiden das Loch in der _image_ oder in der UIImageView einfügen, zeigt es? – matt

+1

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

+0

@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

Antwort

15

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:

enter image description here

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; 
+0

Dies funktionierte perfekt, dank einer Tonne Matt! Ich lese immer noch auf die Sachen, die Sie verknüpft, aber es ist fantastisch zu wissen, ich habe funktionierenden Code zu verweisen: D Danke wieder Mann, du bist super! :) – Phillip

+1

Der wirklich coole Teil (einer von vielen) ist, dass dies auf _any_ UIView funktioniert. Sie können ein Loch in _anything_ schlagen. Außerdem können Sie anstelle eines reinen Lochs ein halbtransparentes Loch stanzen. Was wir hier gemacht haben, ist auch nicht der einzige Weg. Wir hätten einen CAShapeLayer als Maske verwenden können, anstatt ein Bild zu machen. – matt

+0

Das ist/ziemlich cool !! Ich werde das im Hinterkopf behalten, wenn ich jemals wieder so etwas machen muss: D – Phillip

5

Hier ist eine einfache Swift Funktion cut#hole#inView kopieren und für 2017

func cut(hole: CGRect, inView v: UIView) { 
    let p:CGMutablePath = CGMutablePath() 
    p.addRect(inView.bounds) 
    p.addRect(hole) 

    let s = CAShapeLayer() 
    s.path = p 
    s.fillRule = kCAFillRuleEvenOdd 

    v.layer.mask = s 
} 
Verwandte Themen