代码实现引导页遮罩(2)

新建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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容