美文网首页ios进阶
代码实现引导页遮罩(2)

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

作者: jing091111 | 来源:发表于2017-04-12 09:46 被阅读13次

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

相关文章

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

    新建HJHoledView类,代码如下: /* 绘制遮罩可以画(圆形,矩形,圆角矩形,自定义视图) 添加箭头和提示...

  • Swift 添加两种遮罩的方式

    没有遮罩前的效果 代码实现 遮罩方式一 代码实现 遮罩方式二 代码实现 实战 -- 二维码扫描区域遮罩 代码实现 ...

  • 代码实现引导页遮罩(1)---绘制箭头算法

    引导页基本是每个项目都需要的,比如上个新功能需要引导用户点击某个按钮进入某个页面再点击某个按钮啥的。我们一般做法都...

  • 2行代码轻松实现引导页

    在Appdelegate里面加入2行代码就可以实现引导图功能.代码如下: 效果图: github地址

  • iOS编程,怎么加引导页

    在AppDelegate中实现。 在AppDelegate中所有控件创建完成之后, 写引导页代码。注意:引导页在第...

  • 遮罩层实现

    代码如下 实现效果:点击按钮,显示遮罩层,弹出弹框点击遮罩层,隐藏遮罩层,隐藏弹框

  • 轮播引导页

    轮播引导页 轮播引导页早已成为主流的引导方式,下面加单介绍一下实现方式。 界面预览: 代码简介:主要知识点:UIS...

  • 引导页面的蒙版镂空和屏幕适配

    作者:饶尧;标签: 引导页面的蒙版镂空和屏幕适配,技巧 需求 实现一个遮罩蒙版引导 实现难点 镂空蒙版实现方案 箭...

  • 常见的引导页空心遮罩

    今天早上,在群里看到一个同学在问,类似下面这样的引导页,镂空透明看到下面图层的圈圈怎么实现? 其实这个东西,最简单...

  • 引导页的实现大全

    引导页的实现大全

网友评论

    本文标题:代码实现引导页遮罩(2)

    本文链接:https://www.haomeiwen.com/subject/kvgpattx.html