扇形进度
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);
}
以上是关于扇形进度的主要内容,如果未能解决你的问题,请参考以下文章