예제 #1
0
        public override void Draw(CGRect rect)
        {
            var context = UIGraphics.GetCurrentContext();
            var bounds  = Bounds;

            UIColor background = Enabled ? pressed ? HighlightedColor : NormalColor : DisabledColor;
            nfloat  alpha      = 1;

            CGPath container = GraphicsUtil.MakeRoundedRectPath(bounds, 14);

            context.AddPath(container);
            context.Clip();

            using (var cs = CGColorSpace.CreateDeviceRGB())
            {
                var topCenter    = new CGPoint(bounds.GetMidX(), 0);
                var midCenter    = new CGPoint(bounds.GetMidX(), bounds.GetMidY());
                var bottomCenter = new CGPoint(bounds.GetMidX(), bounds.GetMaxY());

                using (
                    var gradient = new CGGradient(cs, new[] { 0.23f, 0.23f, 0.23f, alpha, 0.47f, 0.47f, 0.47f, alpha },
                                                  new nfloat[] { 0, 1 }))
                {
                    context.DrawLinearGradient(gradient, topCenter, bottomCenter, 0);
                }

                container = GraphicsUtil.MakeRoundedRectPath(bounds.Inset(1, 1), 13);
                context.AddPath(container);
                context.Clip();
                using (
                    var gradient = new CGGradient(cs, new[] { 0.05f, 0.05f, 0.05f, alpha, 0.15f, 0.15f, 0.15f, alpha },
                                                  new nfloat[] { 0, 1 }))
                {
                    context.DrawLinearGradient(gradient, topCenter, bottomCenter, 0);
                }

                var nb = bounds.Inset(4, 4);
                container = GraphicsUtil.MakeRoundedRectPath(nb, 10);
                context.AddPath(container);
                context.Clip();

                background.SetFill();
                context.FillRect(nb);

                using (var gradient = new CGGradient(cs, new nfloat[] { 1, 1, 1, .35f, 1, 1, 1, 0.06f }, new nfloat[] { 0, 1 }))
                {
                    context.DrawLinearGradient(gradient, topCenter, midCenter, 0);
                }
                context.SetLineWidth(2);
                context.AddPath(container);
                context.ReplacePathWithStrokedPath();
                context.Clip();

                using (
                    var gradient = new CGGradient(cs, new nfloat[] { 1, 1, 1, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }, new nfloat[] { 0, 1 })
                    )
                {
                    context.DrawLinearGradient(gradient, topCenter, bottomCenter, 0);
                }
            }
        }