2013-02-14 5 views
15

Ich versuche, die unteren beiden Ecken einer UIView abzurunden, und der Rand der Ebene wird ebenfalls abgerundet angezeigt. Ich mache gerade:Runden Sie einige Ecken von UIView ab und runden Sie den Rand der Ansichtsschicht ab.

UIRectCorners corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; 
CGSize radii = CGSizeMake(kThisViewCornerRadius, kThisViewCornerRadius); 
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myView.bounds 
              byRoundingCorners:corners 
               cornerRadii:radii]; 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
[maskLayer setPath:path.CGPath]; 
myView.layer.mask = maskLayer; 

Dies funktioniert gut für normale Ansichten. Allerdings myView ‚s Schicht ihre borderColor und borderWidth gesetzt hat, und wie Sie aus dem Screenshot sehen können, ist die Grenze der Schicht nicht gerundet zu werden:

Screenshot of the problem

Ich habe auch versucht Subklassen UIView und Rückkehr [CAShapeLayer layer] von +[Class layerClass], und Einrichten der Ebene der Ansicht als einer Formebene, aber der Rand landete unterhalb der Unteransichten der Ansicht.

Ist es möglich, einige der Ecken einer Ansicht zu runden, den Rand der Ebenenansicht zu umrunden und die Unteransichten unterhalb des Rands der Ebene zu beschneiden?

Beachten Sie, dass dies ist nicht über, wie man einige Ecken und nicht andere runden, aber eher, wie man den Anschlag erhält, um sich richtig zu benehmen.

+1

eine Form Schicht hinzufügen, die in die Schicht Hierarchie gestrichen wird? –

+0

Guter Vorschlag, aber ich habe es getestet und der Strich der Formschicht zeigt sich immer noch hinter den Unteransichten der Ansicht. –

+0

Eigentlich hat mich dein Kommentar auf den richtigen Weg gebracht, und ich habe es schließlich bekommen. Ich werde es als Antwort posten. Vielen Dank! –

Antwort

36

Ich fand eine neue Art, darüber nachzudenken, dank David Rönnqvist 's Kommentar.

Ich habe versucht, die Eckenrundung und den Strich alle in einer Schicht zu machen. Stattdessen habe ich es in zwei Ebenen aufgeteilt: eine, um die Ebene der Ansicht zu maskieren, um die Ecken zu runden, und die andere in einer Ansicht, um den Strich hinzuzufügen.

UIView *containerView = [[UIView alloc] initWithFrame:someFrame]; 

UIRectCorners corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; 
CGSize radii = CGSizeMake(kThisViewCornerRadius, kThisViewCornerRadius); 

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myView.bounds 
              byRoundingCorners:corners 
               cornerRadii:radii]; 

// Mask the container view’s layer to round the corners. 
CAShapeLayer *cornerMaskLayer = [CAShapeLayer layer]; 
[cornerMaskLayer setPath:path.CGPath]; 
containerView.layer.mask = cornerMaskLayer; 

// Make a transparent, stroked layer which will dispay the stroke. 
CAShapeLayer *strokeLayer = [CAShapeLayer layer]; 
strokeLayer.path = path.CGPath; 
strokeLayer.fillColor = [UIColor clearColor].CGColor; 
strokeLayer.strokeColor = [UIColor redColor].CGColor; 
strokeLayer.lineWidth = 2; // the stroke splits the width evenly inside and outside, 
          // but the outside part will be clipped by the containerView’s mask. 

// Transparent view that will contain the stroke layer 
UIView *strokeView = [[UIView alloc] initWithFrame:containerView.bounds]; 
strokeView.userInteractionEnabled = NO; // in case your container view contains controls 
[strokeView.layer addSublayer:strokeLayer]; 

// configure and add any subviews to the container view 

// stroke view goes in last, above all the subviews 
[containerView addSubview:strokeView]; 
+1

+ 100 Great Sachen – DogCoffee

+0

sehr nett! Kann ich damit optionale Grenzen setzen? – Vishnu

+0

Was meinen Sie mit optionalen Grenzen? –

0

Hier ist der kleine Code. Alloc initialisiert eine Ansicht und sendet an diese Methode, um Ecken gerundet zu bekommen. Sie können optional eine beliebige Ecke umrunden. Geben Sie auch Schattenstrichfarbe.

-(void) setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners withColor: (UIColor*) color 
{ 
UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(9.0, 9.0)]; 

CAShapeLayer* shape = [[[CAShapeLayer alloc] init] autorelease]; 
[shape setPath:rounded.CGPath]; 
shape.strokeColor = [[UIColor grayColor] CGColor]; 

view.backgroundColor=color; 
view.layer.mask = shape; 
} 

Rufen Sie die Methode wie folgt auf.

[self setMaskTo:ABCView byRoundingCorners:UIRectCornerAllCorners withColor:[UIColor greenColor]]; 
+0

Funktioniert das für jeden? Nicht für mich arbeiten .. –

9

Zev Eisenbergs Antwort ist die richtige.

Obwohl ich lieber:

[self.layer addSublayer:strokeLayer]; 

statt der Schaffung und das Hinzufügen einer Subview:

CGSize radii = CGSizeMake(radius, radius); 

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds 
              byRoundingCorners:corners 
               cornerRadii:radii]; 

// Mask the container view’s layer to round the corners. 
CAShapeLayer *cornerMaskLayer = [CAShapeLayer layer]; 
[cornerMaskLayer setPath:path.CGPath]; 
self.layer.mask = cornerMaskLayer; 

// Make a transparent, stroked layer which will dispay the stroke. 
CAShapeLayer *strokeLayer = [CAShapeLayer layer]; 
strokeLayer.path = path.CGPath; 
strokeLayer.fillColor = [UIColor clearColor].CGColor; 
strokeLayer.strokeColor = color.CGColor; 
strokeLayer.lineWidth = 2; // the stroke splits the width evenly inside and outside, 
// but the outside part will be clipped by the containerView’s mask. 

[self.layer addSublayer:strokeLayer];