首页 > 其他分享 >iOS-自定义的画圆或弧的UIView

iOS-自定义的画圆或弧的UIView

时间:2023-06-13 22:31:53浏览次数:51  
标签:自定义 弧线 frame iOS 弧度 画圆 PI self size


 

iOS-自定义的画圆或弧的UIView

 

CustomViewOfCircle.h


#import <UIKit/UIKit.h>

@interface CustomViewOfCircle : UIView

{
    //是否自定义属性:myDot
    BOOL isDefinedMyDot;
    
    //是否自定义属性:myRadius
    BOOL isDefinedMyRadius;
    
    //是否自定义属性:myAngle
    BOOL isDefinedMyAngle;
    
    //是否自定义属性:MyLineWidth
    BOOL isDefinedMyLineWidth;
    
    //是否自定义属性:MyClockWise
    BOOL isDefinedMyClockWise;
}

//圆圈或弧线的边线的颜色,默认为黑色
@property (nonatomic,strong) UIColor* myStrokeColor;

//线的宽度,默认为1.0
@property (nonatomic,assign) CGFloat myLineWidth;

//圆圈或弧线的圆周中心点坐标,默认为当前视图的中心点,即(self.frame.size.width/2,self.frame.size.height/2)
@property (nonatomic,assign) CGPoint myDot;

//圆圈或弧线的半径,默认采用当前视图尺寸(self.frame.size)来计算半径
//计算规则:
//如果 self.frame.size.width > self.frame.size.height ,
//那么 半径=self.frame.size.height/2
//否则 半径=self.frame.size.width/2
//也就是取高、宽中值小的那个的1/2作为半径
@property (nonatomic,assign) CGFloat myRadius;

//圆圈或弧线的范围,用弧度来计算,圆一周总弧度为2*PI(即360度角)。默认值为(0,2*PI)
//angle.x :弧线起点的弧度
//angle.y :弧线终点的弧度
//
//
//               ^ 1.5*PI弧度
//               |
//               |
//               |
//               |
//               |
// 1*PI弧度      |
// -------------------------------->0弧度(2*PI弧度)
//               |
//               |
//               |
//               |
//               |
//               |0.5*PI弧度
//
//
//
//
@property (nonatomic,assign) CGPoint myAngle;

//画弧线方向,为0表示顺势正,为1表示逆时针,默认值为0.
//方向不同,画出的弧线也会不同,例如:
//假设 参数myAngle定义为(0 , 0.5*PI)
//如果 参数myClockWise=0,即将从上图中0弧度开始,沿顺时针方向画弧线到0.5*PI弧度位置,即画了一条90度角的弧线
//如果 参数myClockWise=1,即将从上图中0弧度开始,沿逆时针方向经过1.5*PI弧度、1*PI弧度,然后一直画弧线到0.5*PI弧度位置,相当于画了一条270度角的弧线
@property (nonatomic,assign) int myClockWise;



@end

 

 

CustomViewOfCircle.m



#import "CustomViewOfCircle.h"
#define PI M_PI //圆周率常量
#define default_start_angle 0.0 //默认起始弧度
#define default_end_angle 2*PI //默认终点弧度
#define default_line_width 1.0 //默认线宽


@implementation CustomViewOfCircle

#pragma mark --------------->系统方法区<---------------
-(instancetype)init{
    self=[super init];
    if(self){
        
    }
    return self;
}

-(void)drawRect:(CGRect)rect{
    //圆心坐标点
    if (!isDefinedMyDot) {
        _myDot.x =self.frame.size.width/2;
        _myDot.y =self.frame.size.height/2;
    }
    
    //圆半径
    if (!isDefinedMyRadius) {
        _myRadius=(self.frame.size.width>self.frame.size.height)?self.frame.size.height/2:self.frame.size.width/2;
    }
    
    //弧度
    if (!isDefinedMyAngle) {
        _myAngle.x=default_start_angle;
        _myAngle.y=default_end_angle;
        
    }
    
    //线宽
    if (!isDefinedMyLineWidth) {
        _myLineWidth=default_line_width;
    }
    
    //方向
    if (!isDefinedMyClockWise) {
        _myClockWise=0;
    }
    
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    //画弧线
    CGContextSetStrokeColorWithColor(context, _myStrokeColor.CGColor);
    CGContextSetLineWidth(context, _myLineWidth);//线的宽度
    CGContextAddArc(context, _myDot.x, _myDot.y, _myRadius, _myAngle.x, _myAngle.y, _myClockWise);
    CGContextDrawPath(context, kCGPathStroke); //绘制路径
}

#pragma mark --------------->自定义属性方法区<---------------

-(void)setMyCircleDot : (CGPoint) myCircleDot{
    _myDot.x=myCircleDot.x;
    _myDot.y=myCircleDot.y;
    isDefinedMyDot=YES;
}

-(void)setMyRadius:(CGFloat)myRadius{
    _myRadius=myRadius;
    isDefinedMyRadius=YES;
}

-(void)setMyAngle:(CGPoint)myAngle{
    _myAngle.x=myAngle.x;
    _myAngle.y=myAngle.y;
    isDefinedMyAngle=YES;
}

-(void)setMyLineWidth:(CGFloat)myLineWidth{
    _myLineWidth=myLineWidth;
    isDefinedMyLineWidth=YES;
}

-(void)setMyClockWise:(int)myClockWise{
    _myClockWise=myClockWise;
    isDefinedMyClockWise=YES;
}

@end



 

 

具体调用方法:



#import "ViewController894.h"
#import "CustomViewOfCircle.h"

@interface ViewController894 ()

@end

@implementation ViewController894

- (void)viewDidLoad {
    [super viewDidLoad];
    [self _drawCircle];
}

- (void)_drawCircle {
    
    //define CustomViewOfCircle
    CustomViewOfCircle* cvCircle = [[CustomViewOfCircle alloc] init];
    cvCircle.frame=CGRectMake(50, 100, 200, 200);
    cvCircle.backgroundColor=[UIColor whiteColor];
    
    //设置弧线颜色
    [cvCircle setNewStrokeColor:[UIColor redColor]];
    //设置半径
    [cvCircle setNewRadius:cvCircle.frame.size.width/2-10];
    //设置线宽
    [cvCircle setNewLineWidth:2.0];
    //设置弧线起点、终点弧度
    [cvCircle setNewAngle:CGPointMake(0.0*M_PI,1.5*M_PI)];
    //设置画弧线方向
    [cvCircle setNewClockWise:1];
    
    
    //add subview
    [self.view addSubview:cvCircle];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end


 

iOS-自定义的画圆或弧的UIView_#define


 起始弧度 0,终点弧度 0.5*PI ,逆时针方向

 

 

iOS-自定义的画圆或弧的UIView_#import_02


  起始弧度 0,终点弧度 0.5*PI ,顺时针方向

 

 

 

 

 

 

标签:自定义,弧线,frame,iOS,弧度,画圆,PI,self,size
From: https://blog.51cto.com/u_16160131/6473926

相关文章

  • iOS开发问题集锦
     1.Xcode开发连真机运行报错Pleaseverifythatyourdevice’sclockisproperlyset,andthatyoursigningcertificateisnotexpired. 1.在正常运行的工作电脑上的Xcode导出开发者账号(*.developerprofile)或PKCS12文件(*.p12)进入XcodePreferences|Accounts:选中Apple......
  • SpringBoot自定义线程池
    SpringBoot自定义线程池在SpringBoot中,可以使用@Configuration和@Bean去设置线程池,用@Value去做线程池的参数配置。线程池配置:importcom.google.common.util.concurrent.ThreadFactoryBuilder;importorg.springframework.beans.factory.annotation.Value;importor......
  • 二次封装Axios完全体
    importaxios,{Axios}from"axios";importtype{AxiosRequestConfig}from"axios";import{message}from"antd";//功能失败的错误原因constauthErrMessage:any={ 10031:"登录失效,需要重新登录", 10032:"您太久没登录,请重新登录~......
  • 【vue】前端下载文件自定义文件名称
    【vue】前端下载文件自定义文件名称https://blog.csdn.net/weixin_48200589/article/details/125067618下载文件自定义文件名称文件下载名称不想和后端提供的URL一样怎么办呢?1.首先给按钮去绑定一个事件2.正常我们的下载处理方式3.自定义下载的文件名字文件下载名称......
  • AntDesign自定义校验表单
    <a-rowclass="row":gutter="32"><a-col:span="16"><a-form-itemlabel="场景模板标签"name="tags"><a-......
  • 如何自定义drf的ValidationError()中的传的内容
     鼠标点击ValidationError(),再点击PyCharm右侧对应两个按钮,找见源码如下 结论:你可以直接传dict或list内容......
  • 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
    本文目录1、概述2、自定义菜单的规则3、自定义菜单接口可实现按钮类型的种类4、创建菜单4.1、创建菜单的接口4.2、使用Senparc.Weixin.MPSDK创建自定义菜单4.3、查询已创建的菜单4.4、删除已创建的菜单5、菜单响应事件的处理5.1、点击菜单拉取消息时的事件推送5.2、击菜单跳转链......
  • ios开发 :CUICatalog: Invalid asset name supplied: '(null)'
    _iconImage.image=[UIImageimageNamed:sourceDic[@“image”]];明明有图片,但还是提示这个图片名称不存在报错CUICatalog:Invalidassetnamesupplied:'(null)'打断点进去,显示_iconImage的值是nil添加断点定位到错误在109行-(NSArray*)messageTableSource{if(_mes......
  • 自定义组件触发element-ui el-form 校验
    项目使用element-ui中的el-form进行表单校验,表单中含有上传组件,当校验时机设置change时,实际值已经改变,但没有触发校验。看一下el-select的源码是怎么写的,在watch监听里当value改变时,有这么一段代码this.dispatch('ElFormItem','el.form.change',val);可以引入dispatch函......
  • 前端vue自定义简单实用下拉筛选 下拉菜单
    前端vue自定义简单实用下拉筛选下拉菜单, 下载完整代码请访问: https://ext.dcloud.net.cn/plugin?id=13020效果图如下:   ####使用方法```使用方法<!--titleArr:选择项数组dropArr:下拉项数组@finishDropClick:下拉筛选完成事件--><ccDropDownMenu:tit......