iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析

我们平时使用App的时候, 经常在第一次使用的时候, 会有类似”新手教程”之类的东西, 来引导我们应该如何使用这个App。

但是这个”新手教程”不同于常规的引导页(引导页指第一次打开App时候, 弹出的那种介绍视图。 他是静态的, 不需要与用户交互, 可以直接一页页翻, 或者直接跳过。)所谓的”新手教程”, 就是按照App的提示, 一步步跟着完成。

那这个“新手教程”有什么好处呢?

  1. 指导用户了解操作。 比如, 如何调节音量, 如何设置焦距…
  2. 限制用户填充必要信息, 完成必要操作。

现在大家应该都明白这到底是一个什么东西了。为实现这样的功能, 一般是采用遮罩层效果, 今天花了点时间, 封装好了这样一个功能。 同时把源码分享到我的Github, 需要的可以自己下载。

下载链接: YLZHoledView

同时, 还写了一个demo, 效果如下:

我封装好的这个文件(YLZHoledView), 主要实现了如下功能:

1. 添加多种样式聚光灯效果。(圆形, 矩形, 圆角矩形, 自定义视图)

2. 点击该区域支持delegate回调

3. UIView 中的控件事件穿透。(demo中的按钮, 是在遮罩层下方, 但是正确响应点击事件, 这就是事件穿透)

好了, 大体介绍就到这里, 下面简单解释下核心代码:

delegate回调

YLZHoledView.h

@class YLZHoledView;
@protocol YLZHoledViewDelegate <NSObject>

- (void)holedView:(YLZHoledView *)holedView didSelectHoleAtIndex:(NSUInteger)index;

@end

YLZHoledView.m

#pragma mark - Tap Gesture

 - (void)tapGestureDetectedForGesture:(UITapGestureRecognizer *)gesture
 {
     if ([self.holeViewDelegate respondsToSelector:@selector(holedView:didSelectHoleAtIndex:)]) {
         CGPoint touchLocation = [gesture locationInView:self];
         [self.holeViewDelegate holedView:self didSelectHoleAtIndex:[self holeViewIndexForAtPoint:touchLocation]];
     }
 }

这里先在自定义的View中添加手势, 然后在

- (NSUInteger)holeViewIndexForAtPoint:(CGPoint)touchLocation 中判断点击范围是否属于遮罩层中添加的视图, 再发送委托。

然后在我们的实现类中, 也就是实现这个委托的地方, 就可以通过index来做相关的操作。 我demo里面只是简单的打印。

聚光灯效果

我这里封装了几种常见的类型。(圆形, 矩形, 圆角矩形, 自定义视图)

typedef NS_ENUM(NSInteger, YLZHoleType)
 {
     YLZHoleTypeCirle,
     YLZHoleTypeRect,
     YLZHoleTypeRoundedRect,
     YLZHoleTypeCustomRect
 };

然后重写

- (void)drawRect:(CGRect)rect

通过类型判断, 来重写对应的效果。

比如, 圆形的代码:

if (hole.holeType == YLZHoleTypeRoundedRect) {
             YLZRoundedRectHole *rectHole = (YLZRoundedRectHole *)hole;
             CGRect holeRectIntersection = CGRectIntersection( rectHole.holeRect, self.frame);
             UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:holeRectIntersection
                                                                   cornerRadius:rectHole.holeCornerRadius];

             CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), [[UIColor clearColor] CGColor]);
             CGContextAddPath(UIGraphicsGetCurrentContext(), bezierPath.CGPath);
             CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
             CGContextFillPath(UIGraphicsGetCurrentContext());

}

事件穿透

在这之前, 提一个方法。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

// recursively calls -pointInside:withEvent:. point is in the receiver’s coordinate system

只要实现了最顶层的 UIView 的 hitTest 方法,在某些情况返回下层的某个按钮实例,即相当于把那个按钮的事件透出来了,比如在点击落在该按钮上时,不管这个按钮在 UIView 下多少层都可以把它挖出来。

所以, 重写hitTest方法即可。

 #pragma mark - UIView Overrides
  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
 {
     UIView *hitView = [super hitTest:point withEvent:event];

     if (hitView == self)
     {
         for (UIView *focus in self.focusView) {
             if (CGRectContainsPoint(focus.frame, point))
             {
                 return focus;
             }
         }
     }

     return hitView;
 }
时间: 2024-10-09 12:21:03

iOS开发- 自定义遮罩视图(引导, 功能说明)源码+解析的相关文章

iOS开发- 以图搜图功能实现 (源码+解析)

以图搜图这个功能相当实用, 之前在实现这个功能的时候, 有一些笔记, 今天就整合成博文, 分享给大家. 这个demo主要实现的功能包括: 自定义拍照界面 图像识别 以图搜图 信息获取(通过识别出的图像, 获取对应信息) 下面是一个简单的演示,  如下:       那么如何实现这样的功能呢? 如果自己去完成图像识别, 显然不现实. 最早我研究的是谷歌API, 不过谷歌在天朝, 大家都懂得... 然后是百度了,尝试了下,  效果还不错. 另外, 百度也有自己"以图搜图"对应的App.不过

iOS开发-自定义后台显示图片(iOS7-Background Fetch的应用)

之前在用电池医生的时候, 发现它有这样一个功能:当应用进入后台的时候, 会显示另外一张图片覆盖App Switcher显示的界面. 效果如下: 变成----> 而这样的一个功能, 对于保护用户隐私还是挺有用的. 这就涉及到了Background Fetch的使用.当然, Background Fetch有更多,更有用的功能, 详见-->iOS 7学习:多任务处理之Background Fetch 下面就介绍下后台图片切换的实现. 1.程序配置后台模式 操作如下: 2. AppDelegate.

IOS开发自定义CheckBox控件

IOS本身没有系统的CheckBox组件,但是实际开发中会经常用到,所以专门写了一个CheckBox控件,直接上代码 效果图: UICheckBoxButton.h文件如下: #import #import "Common.h" @interface UICheckBoxButton : UIControl { UILabel *label; UIImageView *icon; BOOL checked; id delegate; } @property (retain, nonat

IOS开发之表视图(UITableView)

IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于数据的展示 我们都会选择表视图,比如通讯录和一些数据列表. 2.我们可以选择创建表视图也可以创建表视图控制器. (二)UITableView基本样式如下(1:UITableViewStylePlain(普通表视图),2:UITableViewStyleGroup(分组表视图)): (三)UITabl

iOS开发自定义时间选取器

又是一年的暑假日期而至,小孩子放假,都会到在外打工的父母身边.孩子想父母,父母也思念着自己的孩子.我身边的亲戚朋友的孩子 也都来了.这个暑假又该热闹起来. 努力什么时候都不晚 我有一个表妹,今年参加完高考,对自己的成绩不是特别满意.上次我回老家,刚好她给我一起来上海.准备来上海锻炼一下. 车上我问她,准备去哪上学?她说不想上了,想打工.我没有怎么劝她,我想让她体验一下打工的生活,她就知道还是上学好. 一个高中生,出来找工作,困难可想而知.经姐姐介绍,进了一家餐厅工作.工资也不是很高.干了两天,我

IOS开发 获取当前视图所在的类名

NSString *stringClass = NSStringFromClass([(UINavigationController *)self.window.rootViewController topViewController].class); IOS开发 获取当前视图所在的类名

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

一 django 生命周期 二 django中间键 1.什么是中间键 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简单来说就相当于django门户,保安:它本质上就是一个自定义类,类中定义了几个方法. 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models): 响应走的时候也需要经过中间件才能到达w

iOS开源库源码解析之SDWebImage

来自Leo的原创博客,转载请著名出处 我的stackoverflow 这个源码解析系列的文章 AsnycDispalyKit SDWebImage(本文) 前言 SDWebImage是iOS开发中十分流行的库,大多数的开发者在下载图片或者加载网络图片并且本地缓存的时候,都会用这个框架.这个框架相对来说,源代码还是比较少的.本文会详细的讲解这些类的架构关系和原理. 本文会先介绍类的整体架构关系,先有一个宏观的认识.然后讲解sd_setImageWithURL的加载逻辑,因为这是SDWebImage

iOS开发之Masonry框架源码解析

Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让我们可以以链式的方式为我们的控件指定约束.本篇博客的主题不是教你如何去使用Masonry框架的,而是对Masonry框架的源码进行解析,让你明白Masonry是如何对NSLayoutConstraint进行封装的,以及Masonry框架中的各个部分所扮演的角色是什么样的.在Masonry框架中,仔细