开发者

Changing the colour of UIPageControl dots in MonoTouch

I was wondering if MonoTouch allows the developer to change the colour of UIPageControl dots to suit a light background - they seem to be fixed white, which makes them very hard to see on a light textured background.

I am aware there is no public API available for this but I was wondering if anything was internally implemented in MonoTouch to开发者_如何转开发 improve on this.

Otherwise, what's the recommended approach to using a UIPageControl on a light background?


I took a stab at translating this. I'm not sure it will work, but it does compile. Note that the page linked to contains comments indicating that Apple frowns upon this code and may reject it:

using System;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace Whatever
{
    public class StyledPageControl : UIPageControl
    {
        public StyledPageControl () : base()
        {
        }

        public override int CurrentPage {
            get {
                return base.CurrentPage;
            }
            set {
                base.CurrentPage = value;
                string imgActive = NSBundle.MainBundle.PathForResource("activeImage", "png");
                string imgInactive = NSBundle.MainBundle.PathForResource("inactiveImage", "png");
                for (int subviewIndex = 0; subviewIndex < this.Subviews.Length; subviewIndex++)
                {
                    UIImageView subview = this.Subviews[subviewIndex] as UIImageView;
                    if (subviewIndex == value) 
                        subview.Image = UIImage.FromFile(imgActive);
                    else
                        subview.Image = UIImage.FromFile(imgInactive);
                }
            }
        }

        public override int Pages {
            get {
                return base.Pages;
            }
            set {
                base.Pages = value;
                string img = NSBundle.MainBundle.PathForResource("inactiveImage", "png");
                for (int subviewIndex = 0; subviewIndex < this.Subviews.Length; subviewIndex++)
                {
                    UIImageView subview = this.Subviews[subviewIndex] as UIImageView;
                        subview.Image = UIImage.FromFile(img);
                }
            }
        }
    }
}


Convert the following code to C#: http://apptech.next-munich.com/2010/04/customizing-uipagecontrols-looks.html


I combined this and this for monotouch. I hope this helps.

The usage is like this:

_pager.Change += delegate(object sender, EventArgs e) {
var pc =  sender as PageControl;
Console.WriteLine ("Change Delegate== " + pc.currentPage);

var toPage = pc.currentPage;
var pageOffset = _scroll.Frame.Width*toPage;
PointF p = new PointF(pageOffset, 0);
Console.WriteLine (pageOffset);
_scroll.SetContentOffset(p,true);
};

And the class like this.

public class PageControl:UIView
{
    #region ctor
    public PageControl (RectangleF rect) :base(rect)
    {
        this.BackgroundColor = UIColor.Red;
        this.CurrenColor=new CGColor(.2f,15f,10F);
        this.OtherColor =new CGColor(.77F,.71F,.60F);
    }
    #endregion 

    #region Fields  
    float kDotDiameter= 7.0f;
    float kDotSpacer = 7.0f;

    int _currentPage;
    int _numberOfPages;
    CGColor CurrenColor{get;set;}
    CGColor OtherColor{get;set;}    

    public int currentPage
    {
        set
        {
            _currentPage = Math.Min(Math.Max(0, value),_numberOfPages-1);
            this.SetNeedsDisplay();
        }
        get{return _currentPage;}
    }

    public int numberOfPages
    {
        set
        {
            _numberOfPages = Math.Max(0,value);
            _currentPage = Math.Min(Math.Max(0, _currentPage), _numberOfPages-1);
            this.SetNeedsDisplay();
        }

        get{return _numberOfPages;}
    }
    #endregion 



    #region Overrides
    public override void Draw (RectangleF rect)
    {
        base.Draw (rect);
        CGContext context = UIGraphics.GetCurrentContext();
        context.SetAllowsAntialiasing(true);
        RectangleF currentBounds = this.Bounds;

        float dotsWidth = this.numberOfPages*kDotDiameter + Math.Max(0,this.numberOfPages-1)*kDotSpacer;
        float x = currentBounds.GetMidX() - dotsWidth/2;
        float y = currentBounds.GetMidY() - kDotDiameter/2;

        for (int i = 0; i < _numberOfPages; i++) {
            RectangleF circleRect = new RectangleF(x,y,kDotDiameter,kDotDiameter);
            if (i==_currentPage) {
                context.SetFillColor(this.CurrenColor);
            }
            else {
                context.SetFillColor(this.OtherColor);

            }
            context.FillEllipseInRect(circleRect);
            x += kDotDiameter + kDotSpacer;
        }

    }

    public override void TouchesBegan (MonoTouch.Foundation.NSSet touches, UIEvent evt)
    {
        base.TouchesBegan (touches, evt);
        PointF touchpoint = (touches.AnyObject as MonoTouch.UIKit.UITouch).LocationInView(this);
        RectangleF currentbounds = this.Bounds;
        float x = touchpoint.X- currentbounds.GetMidX();
        if (x<0 && this.currentPage>=0) {
            this.currentPage--;
            Change(this,EventArgs.Empty);
        }
        else if (x>0 && this.currentPage<this.numberOfPages-1) {
            this.currentPage++;
            Change(this,EventArgs.Empty);

        }

    }
    #endregion

    #region delegate
    public event EventHandler Change;

    #endregion
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜