美文网首页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)

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