title: UIView with rounded corners: how to clip subviews correctly?
body: <p>I created a subclass of <code>UIView</code> that overrides <code>drawRect:</code> and uses <code>AddArcToPoint()</code> to draw rounded corners. (I don't want to use the layer's corner radius property because I need to define which corners have to be rounded.)
  The problem I cannot get over however: if I add a subview at (0|0), it hides my round corners. Any idea how I can fix this? I would like it to clip nicely.</p>
  
  <p>Here's the code that draws the round cornered rectangle. It's Monotouch but should be readably by any developer.</p>
  
  <p>(you can find the full code here: <a href="https://github.com/Krumelur/RoundedRectView">https://github.com/Krumelur/RoundedRectView</a>)</p>
  
  <pre><code>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 &gt; fWidth / 2.0f)
                  {
                      fRadius = fWidth / 2.0f;
                  }
                  if (fRadius &gt; 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 &amp; ROUND_CORNERS.TopLeft) == ROUND_CORNERS.TopLeft ? fRadius : 0);
                  // Arc to right middle.
                  oContext.AddArcToPoint (fMaxX, fMinY, fMaxX, fMidY, (this.RoundCorners &amp; ROUND_CORNERS.TopRight) == ROUND_CORNERS.TopRight ? fRadius : 0);
                  // Arc to bottom middle.
                  oContext.AddArcToPoint (fMaxX, fMaxY, fMidX, fMaxY, (this.RoundCorners &amp; ROUND_CORNERS.BottomRight) == ROUND_CORNERS.BottomRight ? fRadius : 0);
                  // Arc to left middle.
                  oContext.AddArcToPoint (fMinX, fMaxY, fMinX, fMidY, (this.RoundCorners &amp; ROUND_CORNERS.BottomLeft) == ROUND_CORNERS.BottomLeft ? fRadius : 0);
  
                  // Draw the path.
                  oContext.ClosePath ();
                  oContext.DrawPath (CGPathDrawingMode.FillStroke);
              }
          }
  </code></pre>
  
  <p><strong>EDIT:</strong></p>
  
  <p>Here's a piece of code that demonstrates how to solve it using CALayer.</p>
  
  <pre><code>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;
          }
  </code></pre>