ios开发中如何画扇形图

昨天在做项目中,遇到一个需要显示扇形图的功能,网上搜了一下,发现code4app里面也没有找到我想要的那种类似的效果,没办法了,只能自己学习一下如何画了。
首先我们需要了解一个uiview的方法

-(void)drawRect:(CGRect)rect

我们知道了这个方法,就可以在自定义UIView的子类的- (void)drawRect:(CGRect)rect里面绘图了,关于drawrect的调用周期,网上也是一找一大堆,等下我会整理一下,转载一篇供你们参考。
废话少说,下面直接开始代码
首先我们自定义一个继承字uiview的子类,我这里就起名字叫pieview了
首先我们试试先画一个圆

#import "pieview.h"
//直径,其实radius是半径的意思吧,哈哈 算了先用着,demo都写好了就不改了,你们知道就行了
#define radius 50

@implementation pieview

-(void)drawRect:(CGRect)rect
{
        CGContextRef ctx = UIGraphicsGetCurrentContext();//获取图形上下文
        CGPoint cent=CGPointMake((self.frame.size.width/2)-radius/2, (self.frame.size.height/2)-radius/2);//设置图形开始画的坐标原点,根据实际需要设置,我这是随便写的
        CGContextAddEllipseInRect(ctx, CGRectMake(cent.x, cent.y, 100, 100));这个是核心函数,在这里设置图形的开始从哪里画,画的宽度和高度是多少。如果宽高不一样 可就是椭圆了啊
         [[UIColor greenColor] set];//设置颜色
        CGContextFillPath(ctx);//实心的
        //CGContextStrokePath(ctx);空心的
}

@end

然后我们创建一个控制器 pieViewController 引用我们的pieview,展示一下效果

#import "pieViewController.h"
//#import "myview.h"
//#import "JYpieview.h"
#import "pieview.h"
@interface pieViewController ()

@end

@implementation pieViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    pieview *view=[[pieview alloc]init];
    view.frame=CGRectMake(4, 150, 150, 300);
    [self.view addSubview:view];

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

好了看一下效果吧
这里写图片描述
好了,下面让我们开始扇形图的制作吧

#import "pieview.h"
//直径
#define radius 50
#define PI 3.14159265358979323846

@implementation pieview
//计算度转弧度
static inline float radians(double degrees) {
    return degrees * PI / 180;
}
-(void)drawRect:(CGRect)rect
{
    CGPoint cent=CGPointMake((self.frame.size.width/2)-radius/2, (self.frame.size.height/2)-radius/2);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextClearRect(ctx, rect);

    float angle_start = radians(0.0);
    float angle_end = radians(120.0);
    CGContextMoveToPoint(ctx, cent.x, cent.y);
    CGContextSetFillColor(ctx, CGColorGetComponents( [[UIColor greenColor] CGColor]));
    CGContextAddArc(ctx, cent.x, cent.y, radius,  angle_start, angle_end, 0);
    CGContextFillPath(ctx);

    angle_start = angle_end;
    angle_end = radians(360.0);
    CGContextMoveToPoint(ctx, cent.x, cent.y);
    CGContextSetFillColor(ctx, CGColorGetComponents( [[UIColor blueColor] CGColor]));
    CGContextAddArc(ctx, cent.x, cent.y, radius,  angle_start, angle_end, 0);
    CGContextFillPath(ctx);
}
@end

在运行一下,我们看下效果
这里写图片描述
可使有没有觉得上面的代码很多重复的?对的,我们可以封装一个方法 那么重构后的代码我就一次性的贴上去了

#import "pieview.h"
//直径
#define radius 50
#define PI 3.14159265358979323846

@implementation pieview
//计算度转弧度
static inline float radians(double degrees) {
    return degrees * PI / 180;
}
static inline void drawArc(CGContextRef ctx, CGPoint point, float angle_start, float angle_end, UIColor* color) {
    CGContextMoveToPoint(ctx, point.x, point.y);
    CGContextSetFillColor(ctx, CGColorGetComponents( [color CGColor]));
    CGContextAddArc(ctx, point.x, point.y, radius,  angle_start, angle_end, 0);
    //CGContextClosePath(ctx);
    CGContextFillPath(ctx);
}
-(void)drawRect:(CGRect)rect
{
    CGPoint cent=CGPointMake((self.frame.size.width/2)-radius/2, (self.frame.size.height/2)-radius/2);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextClearRect(ctx, rect);

    float angle_start = radians(0.0);
    float angle_end = radians(121.0);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor yellowColor]);

    angle_start = angle_end;
    angle_end = radians(228.0);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor greenColor]);

    angle_start = angle_end;
    angle_end = radians(260);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor orangeColor]);

    angle_start = angle_end;
    angle_end = radians(360);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor purpleColor]);

}
@end

看下运行效果图
这里写图片描述

如果我们中途数据变了 想要改一下图形怎么办呢?
那么我们就需要用到这个

    //通知自定义的view重新绘制图形
//    [self setNeedsDisplay];

这时候我们就要pieview向外界提供一个接口属性,这是我做的模拟5面之后改变圆形的直径大小
.h文件

#import <UIKit/UIKit.h>

@interface pieview : UIView
//直径
@property(nonatomic,assign)float radius;
@end

.m文件

#import "pieview.h"
#define PI 3.14159265358979323846

@implementation pieview
//计算度转弧度
static inline float radians(double degrees) {
    return degrees * PI / 180;
}
static inline void drawArc(CGContextRef ctx, CGPoint point, float angle_start, float angle_end, UIColor* color,float radius) {
    CGContextMoveToPoint(ctx, point.x, point.y);
    CGContextSetFillColor(ctx, CGColorGetComponents( [color CGColor]));
    CGContextAddArc(ctx, point.x, point.y, radius,  angle_start, angle_end, 0);
    //CGContextClosePath(ctx);
    CGContextFillPath(ctx);
}
-(void)drawRect:(CGRect)rect
{
    CGPoint cent=CGPointMake((self.frame.size.width/2)-self.radius/2, (self.frame.size.height/2)-self.radius/2);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextClearRect(ctx, rect);

    float angle_start = radians(0.0);
    float angle_end = radians(121.0);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor yellowColor],self.radius);

    angle_start = angle_end;
    angle_end = radians(228.0);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor greenColor],self.radius);

    angle_start = angle_end;
    angle_end = radians(260);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor orangeColor],self.radius);

    angle_start = angle_end;
    angle_end = radians(360);
    drawArc(ctx, cent, angle_start, angle_end, [UIColor purpleColor],self.radius);

}
-(void)setRadius:(float)radius
{
    _radius=radius;
    [self setNeedsDisplay];
}
@end

pieViewController.m文件

@implementation pieViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    pieview *view=[[pieview alloc]init];
    view.radius=50;
    view.frame=CGRectMake(4, 150, 150, 300);
    [self.view addSubview:view];
    //view.backgroundColor=[UIColor clearColor];
    //模拟5秒后执行这个段代码
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        view.radius=20;
    });
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

效果
这里写图片描述

5秒之后
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS开发上传图片可以采用以下步骤: 1.选择要上传的图片,可以使用系统提供的UIImagePickerController控制器,或者使用第三方库,例如TZImagePickerController。 2.将选的图片转换为NSData格式。 3.使用NSURLSession或AFNetworking等网络库,将图片数据上传到服务器。 以下是一个简单的上传图片的示例代码: ``` // 选择图片 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; [self presentViewController:imagePicker animated:YES completion:nil]; // 将选的图片转换为NSData格式 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info { UIImage *selectedImage = info[UIImagePickerControllerOriginalImage]; NSData *imageData = UIImageJPEGRepresentation(selectedImage, 0.5); // 上传图片到服务器 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; NSURL *url = [NSURL URLWithString:@"http://example.com/upload.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 处理服务器返回的响应 }]; [uploadTask resume]; [picker dismissViewControllerAnimated:YES completion:nil]; } ``` 其,upload.php是服务器端接收图片的脚本文件。在服务器端,可以使用PHP等语言来处理上传的图片数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值