protected override void ArrangeContent(CGSize finalSize)
        {
            Thickness nativePadding = this.GetNativePadding();
            var       padding       = this.Padding;

            var availableSize = new CGSize(
                finalSize.Width - padding.HorizontalThicknessF() - this.Margin.HorizontalThicknessF(),
                finalSize.Height - padding.VerticalThicknessF() - this.Margin.VerticalThicknessF());
            var contentSize = this.MessureContent(availableSize);

            var radioImageWidth = this.NativeUIElement is UIButton ? ((UIButton)this.NativeUIElement).ImageView.Frame.Width : 0;
            var contentFrame    = new CGRect(
                padding.LeftF() + nativePadding.LeftF() + radioImageWidth,
                padding.TopF() + (availableSize.Height - contentSize.Height) / 2,
                contentSize.Width - padding.RightF(),
                contentSize.Height);

            this.NativeArrangeContent(contentFrame);
        }
        protected virtual void ArrangeContent(SizeF finalSize)
        {
            Thickness nativePadding = this.GetNativePadding();

            var totalLeftOffset   = this.Padding.LeftF() + nativePadding.LeftF();
            var totalTopOffset    = this.Padding.TopF() + nativePadding.TopF();
            var totalRightOffset  = this.Padding.RightF() + nativePadding.RightF();
            var totalBottomOffset = this.Padding.BottomF() + nativePadding.BottomF();
            var rawWidthOfRect    = finalSize.Width - this.Margin.HorizontalThicknessF();
            var rawHeigthOfRect   = finalSize.Height - this.Margin.VerticalThicknessF();

            var x      = (nfloat)totalLeftOffset;
            var y      = (nfloat)totalTopOffset;
            var width  = this.contentSize.Width;
            var heigth = this.contentSize.Height;

            if ((rawWidthOfRect - totalLeftOffset - totalRightOffset - this.contentSize.Width) > 0)
            {
                x    += (rawWidthOfRect - totalLeftOffset - totalRightOffset - this.contentSize.Width) / 2;
                width = this.contentSize.Width;
            }

            if ((rawHeigthOfRect - totalTopOffset - totalBottomOffset - this.contentSize.Height) > 0)
            {
                y     += (rawHeigthOfRect - totalTopOffset - totalBottomOffset - this.contentSize.Height) / 2;
                heigth = this.contentSize.Height;
            }

            var contentFrame = new RectangleF(x, y, width, heigth);

            if (this.contentTemplateInstance == null)
            {
                this.NativeArrangeContent(contentFrame);
            }
            else
            {
                this.contentTemplateInstance.Arrange(contentFrame);
            }
        }
예제 #3
0
            private void DrawRect(CGContext g, CGRect rect, Thickness borderThickness, Brush borderBrush, Brush fill, CornerRadius cornerRadius)
            {
                var center      = new CGPoint(rect.Left + cornerRadius.TopLeft + borderThickness.Left / 2, rect.Top + cornerRadius.TopLeft + borderThickness.Top / 2);
                var strokeColor = borderBrush != null?borderBrush.ToUIColor(rect.Size).CGColor : UIColor.Black.CGColor;

                g.SetStrokeColor(strokeColor);
                g.SetFillColor(strokeColor);
                List <Arc> innerArcs = new List <Arc>();

                if (cornerRadius.TopLeft != 0)
                {
                    innerArcs.Add(this.DrawArc(g, cornerRadius.TopLeft, center, borderThickness.LeftF(), borderThickness.TopF(), 180f, 270f));
                }
                else
                {
                    innerArcs.Add(new Arc()
                    {
                        Center = center
                    });
                }
                g.BeginPath();
                g.SetLineWidth(borderThickness.TopF());
                g.MoveTo((nfloat)cornerRadius.TopLeft, borderThickness.TopF() / 2);
                g.AddLineToPoint(rect.Right - (nfloat)cornerRadius.TopRight - borderThickness.RightF() / 2, borderThickness.TopF() / 2);
                g.StrokePath();
                center = new CGPoint(rect.Right - cornerRadius.TopRight - borderThickness.Right / 2, rect.Top + cornerRadius.TopRight + borderThickness.Top / 2);
                if (cornerRadius.TopRight != 0)
                {
                    innerArcs.Add(this.DrawArc(g, cornerRadius.TopRight, center, borderThickness.TopF(), borderThickness.RightF(), -90f, 0f));
                }
                else
                {
                    innerArcs.Add(new Arc {
                        Center = center
                    });
                }
                g.BeginPath();
                g.SetLineWidth(borderThickness.RightF());
                g.MoveTo(rect.Right - borderThickness.RightF() / 2, (nfloat)cornerRadius.TopRight);
                g.AddLineToPoint(rect.Right - borderThickness.RightF() / 2, rect.Height - (nfloat)cornerRadius.BottomRight);
                g.StrokePath();
                center = new CGPoint(rect.Right - cornerRadius.BottomRight - borderThickness.Right / 2, rect.Bottom - cornerRadius.BottomRight - borderThickness.Bottom / 2);
                if (cornerRadius.BottomRight != 0)
                {
                    innerArcs.Add(this.DrawArc(g, cornerRadius.BottomRight, center, borderThickness.RightF(), borderThickness.BottomF(), 0f, 90f));
                }
                else
                {
                    innerArcs.Add(new Arc()
                    {
                        Center = center
                    });
                }
                g.BeginPath();
                g.SetLineWidth(borderThickness.BottomF());
                g.MoveTo(rect.Right - (nfloat)cornerRadius.BottomRight, rect.Bottom - borderThickness.BottomF() / 2);
                g.AddLineToPoint(rect.Left + (nfloat)cornerRadius.BottomLeft, rect.Bottom - borderThickness.BottomF() / 2);
                g.StrokePath();
                center = new CGPoint((rect.Left + cornerRadius.BottomLeft + borderThickness.Left / 2), (rect.Bottom - cornerRadius.BottomLeft - borderThickness.Bottom / 2));
                if (cornerRadius.BottomLeft != 0)
                {
                    innerArcs.Add(this.DrawArc(g, cornerRadius.BottomLeft, center, borderThickness.BottomF(), borderThickness.LeftF(), 90f, 180f));
                }
                else
                {
                    innerArcs.Add(new Arc()
                    {
                        Center = center
                    });
                }
                g.SetLineWidth((nfloat)borderThickness.Left);
                g.MoveTo(rect.Left + borderThickness.LeftF() / 2, rect.Bottom - (nfloat)cornerRadius.BottomLeft);
                g.AddLineToPoint(rect.Left + borderThickness.LeftF() / 2, rect.Top + (nfloat)cornerRadius.TopLeft);
                g.StrokePath();
                if (fill != null)
                {
                    var fillColor = fill.ToUIColor(rect.Size).CGColor;
                    g.SetFillColor(fillColor);
                    g.SetLineWidth(0);
                    using (CGPath path = new CGPath())
                    {
                        path.AddArc(
                            innerArcs[0].Center.X,
                            innerArcs[0].Center.Y,
                            innerArcs[0].Radius,
                            innerArcs[0].EndingAngle,
                            innerArcs[0].StartingAngle,
                            false);

                        path.AddArc(
                            innerArcs[1].Center.X,
                            innerArcs[1].Center.Y,
                            innerArcs[1].Radius,
                            innerArcs[1].EndingAngle,
                            innerArcs[1].StartingAngle,
                            false);

                        path.AddArc(
                            innerArcs[2].Center.X,
                            innerArcs[2].Center.Y,
                            innerArcs[2].Radius,
                            innerArcs[2].EndingAngle,
                            innerArcs[2].StartingAngle,
                            false);

                        path.AddArc(
                            innerArcs[3].Center.X,
                            innerArcs[3].Center.Y,
                            innerArcs[3].Radius,
                            innerArcs[3].EndingAngle,
                            innerArcs[3].StartingAngle,
                            false);

                        g.AddPath(path);
                        g.DrawPath(CGPathDrawingMode.Fill);
                    }
                }
            }