新建HJHoledView类,代码如下:
/*
绘制遮罩可以画(圆形,矩形,圆角矩形,自定义视图)
添加箭头和提示文字
案例:
//添加遮罩指示
self.holedView = [[HJHoledView alloc]initWithFrame:self.view.frame];
[self.holedView setDimingColor: [[UIColor redColor] colorWithAlphaComponent:0.75f]];
//self.holedView.holeViewDelegate = self;
[self.view addSubview:_holedView];
//按钮-圆角矩形
[self.holedView addHoleRoundedRectOnRect:_myButton.frame withCornerRadius:_myButton.frame.size.width/2];
[self.holedView addFocusView:_myButton];
//圆形
[self.holedView addHoleCircleCenteredOnPosition:CGPointMake(190, 110) andDiameter:130];
[self.holedView addHoleCircleCenteredOnPosition:CGPointMake(190, 310) andDiameter:130];
//文字说明
//[self.holedView addHCustomView:[self viewForDemo] onRect:CGRectMake(20.0f, 250.0f, 200.0f, 50.0f)];
[self.holedView addPromptLabelText:@"哈哈哈哈哈哈哈哈" onRect:CGRectMake(20.0f, 150.0f, 200.0f, 50.0f)];
[self.holedView addPromptLabelText:@"嘻嘻嘻嘻嘻嘻嘻" onRect:CGRectMake(20.0f, 200.0f, 200.0f, 50.0f)];
//添加箭头
[self.holedView addArrowView:CGPointMake(100, 150) endPoint:CGPointMake(150, 100)];
[self.holedView addArrowView:CGPointMake(100, 250) endPoint:CGPointMake(150, 300)];
2016年3月1号jing
*/
#import
#import"RTLabel.h"
typedefNS_ENUM(NSInteger, HJHoleType)
{
HJHoleTypeCirle,
HJHoleTypeRect,
HJHoleTypeRoundedRect,
HJHoleTypeCustomRect
};
@classHJHoledView;
@protocolHJHoledViewDelegate
@optional
-(void)animationViewRemove:(HJHoledView*)_animationView;
-(void)animationDidOver:(HJHoledView*)_animationView;
-(void)exitButtonAction:(HJHoledView*)_animationView;
@end
@interfaceHJHoledView :UIView{
__weakid_delegate;
}
@property(weak)id delegate;
@property(strong,nonatomic)UIColor*dimingColor;//颜色默认黑色半透明
- (NSInteger)addHoleCircleCenteredOnPosition:(CGPoint)centerPoint andDiameter:(CGFloat)diamter;
- (NSInteger)addHoleRectOnRect:(CGRect)rect;
- (NSInteger)addHoleRoundedRectOnRect:(CGRect)rect withCornerRadius:(CGFloat)cornerRadius;
- (NSInteger)addHCustomView:(UIView*)customView onRect:(CGRect)rect;//自定义视图
- (UILabel*)addPromptLabelText:(NSString*)_textStr onRect:(CGRect)rect;//提示文字返回UILabel方便修改字体大小颜色等
-(void)addArrowView:(CGPoint)_startP endPoint:(CGPoint)_endP;//添加箭头
-(void)addImgArrowView:(CGPoint)_point rotation:(UIImageOrientation)_orientation;//添加图片箭头
- (void)addFocusView:(UIView*)focus;//添加聚焦按钮之类的
- (void)removeHoles:(BOOL)_isAnimation;
-(void)addExitBtn;//默认位置右上角
-(void)addExitBtn:(CGRect)rect;
@end
//
//HJHoledView.h
//HoledViewTest
//
//Created by hsmob on 16/2/29.
//Copyright © 2016年WeiMob. All rights reserved.
//
#import"HJHoledView.h"
#import"HJArrowView.h"
#pragma mark - holes objects
@interfaceHJHole :NSObject
@property(assign)HJHoleTypeholeType;
@end
@implementationHJHole
@end
@interfaceHJCircleHole :HJHole
@property(assign)CGPointholeCenterPoint;
@property(assign)CGFloatholeDiameter;
@end
@implementationHJCircleHole
@end
@interfaceHJRectHole :HJHole
@property(assign)CGRectholeRect;
@end
@implementationHJRectHole
@end
@interfaceHJRoundedRectHole :HJRectHole
@property(assign)CGFloatholeCornerRadius;
@end
@implementationHJRoundedRectHole
@end
@interfaceHJCustomRectHole :HJRectHole
@property(strong)UIView*customView;
@end
@implementationHJCustomRectHole
@end
@interfaceHJHoledView()
@property(strong,nonatomic)NSMutableArray*holes;//高亮区域数组
@property(strong,nonatomic)NSMutableArray*focusView;//点击区域数组
@end
@implementationHJHoledView
#pragma mark - LifeCycle
- (void)awakeFromNib
{
[superawakeFromNib];
[selfsetup];
}
- (instancetype)initWithCoder:(NSCoder*)aDecoder
{
self= [superinitWithCoder:aDecoder];
if(self) {
[selfsetup];
}
returnself;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self= [superinitWithFrame:frame];
if(self) {
[selfsetup];
[selfshowAnimation];
}
returnself;
}
- (void)setup
{
_holes= [NSMutableArraynew];
_focusView= [NSMutableArraynew];
self.backgroundColor= [UIColorclearColor];
_dimingColor= [[UIColorblackColor]colorWithAlphaComponent:0.75f];
}
-(void)addExitBtn{
floatwidth=40;
floatx=ScreenWidth-width-20;
floaty=20;
CGRectrect=CGRectMake(x,y, width,35);
[selfaddExitBtn:rect];
}
-(void)addExitBtn:(CGRect)rect{
UIButton*exitButton=[[UIButtonalloc]initWithFrame:rect];
[exitButtonsetBackgroundColor:[UIColorcolorWithRed:0.011green:0.000blue:0.000alpha:.000]];
[exitButtonsetTitle:@"退出"forState:UIControlStateNormal];
[exitButtonaddTarget:selfaction:@selector(exitButtonAction:)forControlEvents:UIControlEventTouchUpInside];
[selfaddSubview:exitButton];
}
-(void)exitButtonAction:(UIButton*)exitButton{
HJLog(@"退出按钮事件---");
if([_delegaterespondsToSelector:@selector(exitButtonAction:)]) {
[_delegateexitButtonAction:self];
}
}
-(void)dealloc{
NSLog(@"===HJHoledView===dealloc===");
}
#pragma mark - UIView Overrides
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView*hitView = [superhitTest:pointwithEvent:event];
HJLog(@"===hitTest===");
if(hitView ==self)
{
for(HJHole* holeinself.holes) {
if(hole.holeType==HJHoleTypeRoundedRect) {
HJRoundedRectHole*rectHole = (HJRoundedRectHole*)hole;
if(CGRectContainsPoint(rectHole.holeRect, point)){
HJLog(@"===点击到1===");
returnnil;
}
}elseif(hole.holeType==HJHoleTypeRect) {
HJRectHole*rectHole = (HJRectHole*)hole;
if(CGRectContainsPoint(rectHole.holeRect, point)){
HJLog(@"===点击到2===");
returnnil;
}
}elseif(hole.holeType==HJHoleTypeCirle) {
HJCircleHole*circleHole = (HJCircleHole*)hole;
CGRectrectInView =CGRectMake(floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),
floorf(circleHole.holeCenterPoint.y- circleHole.holeDiameter*0.5f),
circleHole.holeDiameter,
circleHole.holeDiameter);
if(CGRectContainsPoint(rectInView, point)){
HJLog(@"===点击到3===");
returnnil;
}
}
}
//for (UIView *focus in self.focusView) {
//if (CGRectContainsPoint(focus.frame, point))
//{HJLog(@"focus.frame:%f,point:%f",focus.frame.size.height,point.y);
//return focus;
//}
//}
}
returnhitView;
}
- (void)drawRect:(CGRect)rect
{
[selfremoveCustomViews];
CGContextRefcontext =UIGraphicsGetCurrentContext();
if(context ==nil) {
return;
}
[self.dimingColorsetFill];
UIRectFill(rect);
for(HJHole* holeinself.holes) {
[[UIColorclearColor]setFill];
if(hole.holeType==HJHoleTypeRoundedRect) {
HJRoundedRectHole*rectHole = (HJRoundedRectHole*)hole;
CGRectholeRectIntersection =CGRectIntersection( rectHole.holeRect,self.frame);
UIBezierPath*bezierPath = [UIBezierPathbezierPathWithRoundedRect:holeRectIntersection
cornerRadius:rectHole.holeCornerRadius];
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), [[UIColorclearColor]CGColor]);
CGContextAddPath(UIGraphicsGetCurrentContext(), bezierPath.CGPath);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeClear);
CGContextFillPath(UIGraphicsGetCurrentContext());
}elseif(hole.holeType==HJHoleTypeRect) {
HJRectHole*rectHole = (HJRectHole*)hole;
CGRectholeRectIntersection =CGRectIntersection( rectHole.holeRect,self.frame);
UIRectFill( holeRectIntersection );
}elseif(hole.holeType==HJHoleTypeCirle) {
HJCircleHole*circleHole = (HJCircleHole*)hole;
CGRectrectInView =CGRectMake(floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),
floorf(circleHole.holeCenterPoint.y- circleHole.holeDiameter*0.5f),
circleHole.holeDiameter,
circleHole.holeDiameter);
CGContextSetFillColorWithColor( context, [UIColorclearColor].CGColor);
CGContextSetBlendMode(context,kCGBlendModeClear);
CGContextFillEllipseInRect( context, rectInView );
}
}
[selfaddCustomViews];
}
#pragma mark - Add methods
- (NSInteger)addHoleCircleCenteredOnPosition:(CGPoint)centerPoint andDiameter:(CGFloat)diameter
{
HJCircleHole*circleHole = [HJCircleHolenew];
circleHole.holeCenterPoint= centerPoint;
circleHole.holeDiameter= diameter;
circleHole.holeType=HJHoleTypeCirle;
[self.holesaddObject:circleHole];
[selfsetNeedsDisplay];
return[self.holesindexOfObject:circleHole];
}
- (NSInteger)addHoleRectOnRect:(CGRect)rect
{
HJRectHole*rectHole = [HJRectHolenew];
rectHole.holeRect= rect;
rectHole.holeType=HJHoleTypeRect;
[self.holesaddObject:rectHole];
[selfsetNeedsDisplay];
return[self.holesindexOfObject:rectHole];
}
- (NSInteger)addHoleRoundedRectOnRect:(CGRect)rect withCornerRadius:(CGFloat)cornerRadius
{
HJRoundedRectHole*rectHole = [HJRoundedRectHolenew];
rectHole.holeRect= rect;
rectHole.holeCornerRadius= cornerRadius;
rectHole.holeType=HJHoleTypeRoundedRect;
[self.holesaddObject:rectHole];
[selfsetNeedsDisplay];
return[self.holesindexOfObject:rectHole];
}
- (NSInteger)addHCustomView:(UIView*)customView onRect:(CGRect)rect
{
HJCustomRectHole*customHole = [HJCustomRectHolenew];
customHole.holeRect= rect;
customHole.customView= customView;
customHole.holeType=HJHoleTypeCustomRect;
[self.holesaddObject:customHole];
[selfsetNeedsDisplay];
return[self.holesindexOfObject:customHole];
}
- (void)addFocusView:(UIView*)focus
{
//[self.focusView addObject:focus];
[selfaddSubview:focus];
}
- (void)removeHoles:(BOOL)_isAnimation
{
if(_isAnimation){
//添加动画
[selfdisappearAnimation];
}else{
[selfendAnimationFinish];
}
}
#pragma mark - Overided setter
- (void)setDimingColor:(UIColor*)dimingColor
{
_dimingColor= dimingColor;
[selfsetNeedsDisplay];
}
#pragma mark - Tap Gesture
- (NSUInteger)holeViewIndexForAtPoint:(CGPoint)touchLocation
{
__blockNSUIntegeridxToReturn =NSNotFound;
[self.holesenumerateObjectsUsingBlock:^(HJHole*hole,NSUIntegeridx,BOOL*stop) {
if(hole.holeType==HJHoleTypeRoundedRect||
hole.holeType==HJHoleTypeRect||
hole.holeType==HJHoleTypeCustomRect) {
HJRectHole*rectHole = (HJRectHole*)hole;
if(CGRectContainsPoint(rectHole.holeRect, touchLocation)) {
idxToReturn = idx;
*stop =YES;
}
}elseif(hole.holeType==HJHoleTypeCirle) {
HJCircleHole*circleHole = (HJCircleHole*)hole;
CGRectrectInView =CGRectMake(floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),
floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),
circleHole.holeDiameter,
circleHole.holeDiameter);
if(CGRectContainsPoint(rectInView, touchLocation)) {
idxToReturn = idx;
*stop =YES;
}
}
}];
returnidxToReturn;
}
#pragma mark - Custom Views
- (void)removeCustomViews
{
[self.holesenumerateObjectsUsingBlock:^(idobj,NSUIntegeridx,BOOL*stop) {
if([objisKindOfClass:[HJCustomRectHoleclass]]) {
HJCustomRectHole*hole = (HJCustomRectHole*)obj;
[hole.customViewremoveFromSuperview];
}
}];
}
- (void)addCustomViews
{
[self.holesenumerateObjectsUsingBlock:^(idobj,NSUIntegeridx,BOOL*stop) {
if([objisKindOfClass:[HJCustomRectHoleclass]]) {
HJCustomRectHole*hole = (HJCustomRectHole*)obj;
[hole.customViewsetFrame:hole.holeRect];
[selfaddSubview:hole.customView];
}
}];
}
#pragma mark Prompt label
//提示文字返回UILabel方便修改字体大小颜色等
- (UILabel*)addPromptLabelText:(NSString*)_textStr onRect:(CGRect)rect{
UILabel*promptLabel=[[UILabelalloc]initWithFrame:rect];
[promptLabelsetFont:[UIFontsystemFontOfSize:20]];
[promptLabelsetTextColor:[UIColorwhiteColor]];
[promptLabelsetTextAlignment:NSTextAlignmentCenter];
promptLabel.text=_textStr;
[selfaddSubview:promptLabel];
returnpromptLabel;
}
//添加箭头
-(void)addArrowView:(CGPoint)_startP endPoint:(CGPoint)_endP{
HJArrowView*arrowView=[[HJArrowViewalloc]initWithFrame:self.frame];
arrowView.startP=_startP;
arrowView.endP=_endP;
[arrowViewdrawLine:self];
}
//添加图片箭头
-(void)addImgArrowView:(CGPoint)_point rotation:(UIImageOrientation)_orientation{
HJArrowView*arrowView=[[HJArrowViewalloc]initWithFrame:self.frame];
arrowView.imgPoint=_point;
arrowView.orientation=_orientation;
[arrowViewimageArrow:self];
}
#pragma mark动画
-(void)showAnimation{
self.alpha=0;
[UIViewbeginAnimations:@"endAnimation"context:nil];
[UIViewsetAnimationBeginsFromCurrentState:YES];//保持当前位置状态
[UIViewsetAnimationDuration:0.5f];
[UIViewsetAnimationCurve:UIViewAnimationCurveLinear];
self.alpha=1;
[UIViewcommitAnimations];
}
-(void)disappearAnimation{
if(_delegate&& [_delegaterespondsToSelector:@selector(animationViewRemove:)]){
[_delegateanimationViewRemove:self];
}
[UIViewbeginAnimations:@"endAnimation"context:nil];
[UIViewsetAnimationBeginsFromCurrentState:YES];//保持当前位置状态
[UIViewsetAnimationDelegate:self];
[UIViewsetAnimationDidStopSelector:@selector(endAnimationFinish)];
[UIViewsetAnimationDuration:0.5f];
[UIViewsetAnimationCurve:UIViewAnimationCurveLinear];
self.alpha=0;
[UIViewcommitAnimations];
}
-(void)endAnimationFinish{
if([_delegaterespondsToSelector:@selector(animationDidOver:)]) {
[_delegateanimationDidOver:self];
}
[self.holesremoveAllObjects];
[self.focusViewremoveAllObjects];
[selfremoveCustomViews];
[selfsetNeedsDisplay];
[selfremoveFromSuperview];
}
@end
网友评论