扇形进度

Posted 墨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扇形进度相关的知识,希望对你有一定的参考价值。

1:扇形进度视图及运用

首先先创建扇形的视图,传入进度值

#import <UIKit/UIKit.h>

@interface LHProgressView : UIView

@property (nonatomic) float progress;

@end
#import "LHProgressView.h"
#define MinProgress (1.0 / 16.0)

@implementation LHProgressView

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor clearColor];
        _progress = MinProgress;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextFillPath(context);
    CGRect aRect= CGRectMake(2, 2, self.bounds.size.width - 4, self.bounds.size.height - 4);
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 0.9);
    CGContextSetLineWidth(context, 2.0);
    CGContextAddEllipseInRect(context, aRect);
    CGContextDrawPath(context, kCGPathStroke);
    
    CGFloat centerX = self.bounds.size.width / 2;
    CGFloat centerY = self.bounds.size.height / 2;
    
    UIColor *aColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.9];
    CGContextSetFillColorWithColor(context, aColor.CGColor);
    CGContextSetLineWidth(context, 0.0);
    CGContextMoveToPoint(context, centerX, centerY);
    CGContextAddArc(context, centerX, centerY, (self.bounds.size.width - 10) / 2,  - M_PI_2, - M_PI_2 + self.progress * 2 *M_PI, 0);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);

}

- (void)setProgress:(float)progress
{
    _progress = progress;
    
    if (_progress < MinProgress) {
        _progress = MinProgress;
    }
    
    if (_progress >= 1.0) {
        
        [self setNeedsDisplay];
        [self removeFromSuperview];
        
    } else {
        
        [self setNeedsDisplay];
        
    }
    
}

@end

运用:

@property(nonatomic, strong)LHProgressView *progressView;
-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        
        self.backgroundColor = [UIColor clearColor];
        
        _progressView = [[LHProgressView alloc] init];
        
    }
    
    return self;
}
- (void)setItemImageUrl:(NSString *)itemImageUrl
{
    _itemImageUrl = itemImageUrl;
    
    BOOL imageExist = [[SDWebImageManager sharedManager] cachedImageExistsForURL:[NSURL URLWithString:itemImageUrl]];
    
    if (_itemImageProgress == 1.0 || imageExist) {
        
        [_progressView removeFromSuperview];
        
    } else {
        
        _progressView.bounds = CGRectMake(0, 0, 50, 50);
        _progressView.center = CGPointMake((self.bounds.size.width) / 2, (self.bounds.size.height) / 2);
        [self addSubview:_progressView];
        
        _progressView.progress = _itemImageProgress;
        
    }
    
    _itemImageView.image = _itemImage;
    
    [self resetSize];
    
    __weak LHProgressView *progressView = _progressView;
    __weak LHPhotoView *photoView = self;
    NSInteger index = self.tag - 1;
    
    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:itemImageUrl] options:SDWebImageRetryFailed | SDWebImageLowPriority progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        
        if ([photoView.photoViewDelegate respondsToSelector:@selector(photoIsShowingPhotoViewAtIndex:)]) {
            BOOL isShow = [photoView.photoViewDelegate photoIsShowingPhotoViewAtIndex:index];
            
            if (isShow) {
                if (receivedSize > kMinProgress) {
                    progressView.progress = (float)receivedSize/expectedSize;
                }
            }
            
        }
        
        if ([photoView.photoViewDelegate respondsToSelector:@selector(updatePhotoProgress:andIndex:)]) {
            [photoView.photoViewDelegate updatePhotoProgress:(float)receivedSize/expectedSize andIndex:index];
        }
        
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        
        if (image) {
            if ([photoView.photoViewDelegate respondsToSelector:@selector(photoIsShowingPhotoViewAtIndex:)]) {
                BOOL isShow = [photoView.photoViewDelegate photoIsShowingPhotoViewAtIndex:index];
                
                if (isShow) {
                    photoView.itemImageView.image = image;
                    
                    [self resetSize];
                }
                
            }
            
            if ([photoView.photoViewDelegate respondsToSelector:@selector(updatePhotoProgress:andIndex:)]) {
                [photoView.photoViewDelegate updatePhotoProgress:1.0 andIndex:index];
            }
        }
        
        
    }];
    
}

注意:在break里面要先处理一下对象__weak LHProgressView *progressView = _progressView;上面也用到SDWebImage进行图片加载,并把进度赋值

 

2:Delegate运用在开放事件中

#import <UIKit/UIKit.h>
@class DMDropDownMenu;

@protocol DMDropDownMenuDelegate <NSObject>

- (void)selectIndex:(NSInteger)index AtDMDropDownMenu:(DMDropDownMenu *)dmDropDownMenu;

@end
@interface DMDropDownMenu : UIView

@property(nonatomic,assign)id<DMDropDownMenuDelegate>delegate;

@end
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self tapAction];
    _curText.text = self.listArr[indexPath.row];
    if ([_delegate respondsToSelector:@selector(selectIndex:AtDMDropDownMenu:)]) {
        [_delegate selectIndex:indexPath.row AtDMDropDownMenu:self];
    }
}

运用时三步代码:

@interface ViewController ()<DMDropDownMenuDelegate>
@end

    DMDropDownMenu * dm1 = [[DMDropDownMenu alloc] initWithFrame:CGRectMake(10, 150, 299, 30)];
    dm1.delegate = self;
    [self.view addSubview:dm1];


- (void)selectIndex:(NSInteger)index AtDMDropDownMenu:(DMDropDownMenu *)dmDropDownMenu
{
    NSLog(@"dropDownMenu:%@ index:%d",dmDropDownMenu,index);
}

以上是关于扇形进度的主要内容,如果未能解决你的问题,请参考以下文章

前端扇形进度条怎么实现

Qt QML 基于画布的扇形的进度条(Canvas)

Qt QML 基于画布的扇形的进度条(Canvas)

如何使用纯css制作扇形图,合并起来形成饼图

C#自定义控件 ————进度条

绘制扇形