</pre><p><span style="font-family:Consolas,'Courier New',Courier,mono,serif; line-height:18px">虽然简单粗暴,但是很容易理解,个人也是第一次写IOS的自定义控件,完全按照android的来理解的,先上代码,mac电脑不太会截图,晚点上图  </span></p><p>.m文件</p><p></p><pre name="code" class="objc"><pre name="code" class="objc">
#import "SideProgreeView.h"
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
//控件宽度
#define SIDEVIEW_WIDTH 15
//点的半径
#define SIDEVIEW_DOT_R 3
//点之间的间隔距离
#define SIDEVIEW_DOT_INTEVER 9
@implementation SideProgreeView

//这里是在外部初始化的方法,我都是习惯用代码创建控件,storyboard用不惯
//外部调用就是用这个来初始化,不要用initWithFrame
- (id)initWithDotSize:(NSInteger)size rightX:(NSInteger)x{
    NSInteger height=SIDEVIEW_WIDTH+size*(SIDEVIEW_DOT_R*2+SIDEVIEW_DOT_INTEVER)-SIDEVIEW_DOT_INTEVER;
    //调用父类的初始化方法,直接在这里设置该控件的frame,因为需求,控件是垂直居中的,所以y坐标直接用(屏幕宽度-控件高度)/2,x轴坐标可以从外部传入
    //控件的高度是根据传入的size来计算的,根据点的多少,计算高度,计算公式在上面的height那里
    self = [super initWithFrame:CGRectMake(x-SIDEVIEW_WIDTH, (SCREEN_HEIGHT-height)/2, SIDEVIEW_WIDTH, height)];
    if(self != nil){
        //把点的数量传入
        self.dotSize=size;
    }
    //这里把背景色清除,否则背景是黑色
    [self setBackgroundColor:[UIColor clearColor]];
    //当前选中默认为0
    self.nowPosition=0;
    
    return self;
}

//就是android的ondraw方法
- (void)drawRect:(CGRect)rect {
    //绘图的过程根据后面的图片来看,只说最关键的几个点
    //第一步:获取绘图上下文
    CGContextRef ref=UIGraphicsGetCurrentContext();
    //第二步:设置画笔颜色,就是类似于mPaint.setcolor....
    CGContextSetRGBFillColor(ref, 0.0f, 0.0f, 0.0f, 0.3f);
    //第三步:绘制图形
    CGContextAddRect(ref, CGRectMake(0, rect.size.width/2, rect.size.width, rect.size.height-rect.size.width));
    CGContextAddArc(ref, rect.size.width/2, rect.size.width/2, rect.size.width/2, 0, 180*M_PI/180, 1);
     CGContextAddArc(ref, rect.size.width/2, rect.size.height-rect.size.width/2, rect.size.width/2, 0, 180*M_PI/180, 0);
    //第四步:填充图形
    CGContextFillPath(ref);
    //这就是绘制一个图形的完整步骤,其他的举一反三,动动脑筋,然后自行百度,所有效果就都出来了
    
    //以下是绘制点的,整个图形分为背景和点两个部分,所以分开绘制
    for (int a=0; a<self.dotSize; a++) {
        if(a==self.nowPosition){
            //如果是选中的点,实心
            CGContextSetRGBFillColor(ref, 0.3f, 0.3f, 0.3f, 1.0f);
            CGContextAddArc(ref, rect.size.width/2, rect.size.width/2+(SIDEVIEW_DOT_R*2+SIDEVIEW_DOT_INTEVER)*a+SIDEVIEW_DOT_R, SIDEVIEW_DOT_R, 0, 2*M_PI,1);
            CGContextFillPath(ref);
        }else{
            //如果是未选中的点,空心
            CGContextSetRGBStrokeColor(ref, 0.3f, 0.3f, 0.3f, 1.0f);
            CGContextAddArc(ref, rect.size.width/2, rect.size.width/2+(SIDEVIEW_DOT_R*2+SIDEVIEW_DOT_INTEVER)*a+SIDEVIEW_DOT_R, SIDEVIEW_DOT_R, 0, 2*M_PI,1);
            CGContextStrokePath(ref);
        }
    }
    
}

//设置点的位置
-(void)setPosition:(NSInteger)posi{
    self.nowPosition=posi;
    //刷新,就是调用drawRect,类似于android的invalidate
    [self setNeedsDisplay];
}

@end



.h文件

#import <UIKit/UIKit.h>

@interface SideProgreeView : UIView
@property(nonatomic)NSInteger dotSize;
@property(nonatomic)NSInteger nowPosition;

- (id)initWithDotSize:(NSInteger)size rightX:(NSInteger)x;
-(void)setPosition:(NSInteger)posi;
@end




效果就是右边那个红框框里的控件,中间的内容卡片是放在一个UIScrollView里面,可以进行滑动,点的数量对应着内容卡片的数量,就是在初始化控件时调用initWithDotSize来初始化,随着scrollview的滑动,点也会跟着发生变化,就是监听scrollview的滑动事件,调用自定义控件的setPosition方法设置点的位置。

ios开发自定义弹窗 ios自定义控件_控件