Ответ 1
Я не пробовал, но я думаю, вы могли бы использовать свойство маски CALayer для этого. Вам нужно нарисовать округленный прямоугольник в слой, который был установлен как маска для вашего слоя.
Я создал подкласс UIView
, который переопределяет drawRect:
и использует AddArcToPoint()
для рисования округлых углов. (Я не хочу использовать свойство углового радиуса слоя, потому что мне нужно определить, какие углы нужно округлить.)
Проблема, которую я не могу преодолеть: если я добавлю subview в (0 | 0), он скрывает мои круглые углы. Любая идея, как я могу это исправить? Я бы хотел, чтобы он хорошо запечатлелся.
Вот код, который рисует прямоугольник с круглым углом. Это Monotouch, но должен быть доступен любому разработчику.
(здесь вы можете найти полный код: 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:
Вот фрагмент кода, который демонстрирует, как его решить, используя 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;
}
Я не пробовал, но я думаю, вы могли бы использовать свойство маски CALayer для этого. Вам нужно нарисовать округленный прямоугольник в слой, который был установлен как маска для вашего слоя.
Возможно (и, по сути, очень просто) указать конкретные закругленные углы, не прибегая к drawRect:
, или вручную рисовать частично закругленный прямоугольник в слой. См. мой ответ по аналогичному вопросу.