UIView avec des coins arrondis: comment clip des sous-vues correctement?

J'ai créé une sous-classe de UIView qui remplace drawRect: et utilise AddArcToPoint() pour dessiner des coins arrondis. (Je ne veux pas utiliser la couche du rayon de l'angle de la propriété parce que j'ai besoin pour définir les coins doivent être arrondis.)
Le problème je ne peux pas obtenir plus de toutefois: si j'ajoute un sous-vue au (0/0), il cache mes coins ronds. Une idée de comment je peux résoudre ce problème? J'aimerais que ce clip joliment.

Voici le code qui attire la tour acculé rectangle. C'est Monotouch, mais devrait être lisible par n'importe quel développeur.

(vous pouvez trouver le code complet ici: https://github.com/Krumelur/RoundedRectView)

public override void Draw (RectangleF rect)
{
using (var oContext = UIGraphics.GetCurrentContext())
{
oContext.SetLineWidth (this.StrokeWidth);
oContext.SetStrokeColor (this.oStrokeColor.CGColor);
oContext.SetFillColor (this.oRectColor.CGColor);
RectangleF oRect = this.Bounds;
float fRadius = this.CornerRadius;
float fWidth = oRect.Width;
float fHeight = oRect.Height;
//Make sure corner radius isn't larger than half the shorter side.
if (fRadius > fWidth / 2.0f)
{
fRadius = fWidth / 2.0f;
}
if (fRadius > fHeight / 2.0f)
{
fRadius = fHeight / 2.0f;    
}
float fMinX = oRect.GetMinX ();
float fMidX = oRect.GetMidX ();
float fMaxX = oRect.GetMaxX ();
float fMinY = oRect.GetMinY ();
float fMidY = oRect.GetMidY ();
float fMaxY = oRect.GetMaxY ();
//Move to left middle.
oContext.MoveTo (fMinX, fMidY);
//Arc to top middle.
oContext.AddArcToPoint (fMinX, fMinY, fMidX, fMinY, (this.RoundCorners & ROUND_CORNERS.TopLeft) == ROUND_CORNERS.TopLeft ? fRadius : 0);
//Arc to right middle.
oContext.AddArcToPoint (fMaxX, fMinY, fMaxX, fMidY, (this.RoundCorners & ROUND_CORNERS.TopRight) == ROUND_CORNERS.TopRight ? fRadius : 0);
//Arc to bottom middle.
oContext.AddArcToPoint (fMaxX, fMaxY, fMidX, fMaxY, (this.RoundCorners & ROUND_CORNERS.BottomRight) == ROUND_CORNERS.BottomRight ? fRadius : 0);
//Arc to left middle.
oContext.AddArcToPoint (fMinX, fMaxY, fMinX, fMidY, (this.RoundCorners & ROUND_CORNERS.BottomLeft) == ROUND_CORNERS.BottomLeft ? fRadius : 0);
//Draw the path.
oContext.ClosePath ();
oContext.DrawPath (CGPathDrawingMode.FillStroke);
}
}

EDIT:

Voici un morceau de code qui montre comment le résoudre à l'aide de CALayer.

private void UpdateMask()
{
UIBezierPath oMaskPath = UIBezierPath.FromRoundedRect (this.Bounds, this.eRoundedCorners, new SizeF (this.fCornerRadius, this.fCornerRadius));
CAShapeLayer oMaskLayer = new CAShapeLayer ();
oMaskLayer.Frame = this.Bounds;
oMaskLayer.Path = oMaskPath.CGPath;
this.Layer.Mask = oMaskLayer;
}
De toute façon pour ajouter des bordures aux arrondis vue?
Assurez-vous. Dans DrawLayer ajouter un CGPath.FromRoundedRect() et utiliser une chose contour noir.

OriginalL'auteur Krumelur | 2011-11-07