iOS应用中,空白skype登录界面空白,怎么管理

iOS下点击任意空白Dismiss当前自定义的AlertView - IOS - 伯乐在线
& iOS下点击任意空白Dismiss当前自定义的AlertView
iOS下原生的UIAlertView/UIActionSheet/UIAlertController有时候无法满足我们的需求,我们就会自定义一些弹出框。一般的自定义方案通常是定义一个UIView或者UIView的子类,然后在上面添加一些组件,最后添加到我们指定的parentView上,中间可能还会加几个比较炫酷的动画,这样就达到了我们某些弹出框或者菜单的效果。问题出在如果我们添加到某个View上,但是该View不是全屏的View,我们点击某些地方可能就无法获取到触摸事件,我们的菜单就无法得到响应。
我们定义菜单的时候一般会设计如下所示的两个方法:
- (NSInteger)showInView:(UIView *)view animated:(BOOL)
- (void)dismissAnimated:(BOOL)animated
每当我们需要展示菜单的时候,我们就调用showInView:方法,把菜单添加到view上,反之,当菜单需要结束的时候,就会被dismiss。
之前也有一篇自定义菜单的文章:,当时的重点不在于介绍AlertView,大家可以下载体验下。
很多时候我们设计的菜单都是非阻塞用户操作的,意思就是点击空白的时候,不能因为有菜单,而影响用户的操作,至少是点击空白的时候,要将菜单消失掉。当我们的view不是全屏的时候,我们如何能做到点击view区域外面还能dismiss当前的菜单呢?
之前的文章介绍过iOS的事件分发模块,大家可以查看之前的博客get这些知识,HitTest其实是给View第一次机会,去处理一些东西。有一点值得肯定的是,如果touchEvent发生在View’s的frame之外,则该View无法检测到这个touchEvent。所以我们要想实现博客所描述的功能,我们只能依赖于新插入的View。思路很简单,每次菜单展示的时候,插入一个透明的View到当前的window上,抓住hitTest给的这次机会,去根据当前情况分发事件。
1、如果点击区域在菜单内,则把事件分发给菜单
2、否则则直接dismiss掉菜单
这里提供一些简单的事件分发代码,以供大家参考
Objective-C
__weak STAlertView *weakSelf =
self.hitTestView = [[UIView alloc] init];
self.hitTestView.hitTestBlock = ^(CGPoint point, UIEvent *event, BOOL *returnSuper) {
CGRect contentRect = [weakSelf.superview convertRect:weakSelf.frame toView:nil];
if (!CGPointInRect(point, contentRect)){
[weakSelf dismissActionFired:nil];
*returnSuper = YES;
return (UIView *)
self.hitTestView.backgroundColor = [UIColor clearColor];
1234567891011
__weak STAlertView *weakSelf = self;self.hitTestView = [[UIView alloc] init];self.hitTestView.hitTestBlock = ^(CGPoint point, UIEvent *event, BOOL *returnSuper) {&&&&CGRect contentRect = [weakSelf.superview convertRect:weakSelf.frame toView:nil];&&&&if (!CGPointInRect(point, contentRect)){&&&&&&&&[weakSelf dismissActionFired:nil];&&&&&& *returnSuper = YES;&&&&}&&&&return (UIView *)nil;};self.hitTestView.backgroundColor = [UIColor clearColor];
然后在show的时候,将self.hitTestView添加到window上,dismiss的时候,从window移除。
Objective-C
- (NSInteger)showInView:(UIView *)view animated:(BOOL)animated {
self.hitTestView.frame = [UIScreen mainScreen].
[[UIApplication sharedApplication].delegate.window addSubview:self.hitTestView];
- (void)_dismissAnimated:(BOOL)animated completion:(void (^)(BOOL))_completion {
void (^completion)(BOOL) = ^(BOOL finished) {
[self.hitTestView removeFromSuperview];
if (animated) {
[UIView animateWithDuration:0.35 animations:... completion:completion];
completion(YES);
123456789101112131415161718
- (NSInteger)showInView:(UIView *)view animated:(BOOL)animated {&&&&self.hitTestView.frame = [UIScreen mainScreen].bounds;&&&&[[UIApplication sharedApplication].delegate.window addSubview:self.hitTestView];&&&&...}&- (void)_dismissAnimated:(BOOL)animated completion:(void (^)(BOOL))_completion {&&&&...&&&&void (^completion)(BOOL) = ^(BOOL finished) {&&&&&&&&[self.hitTestView removeFromSuperview];&&&&};&&&&if (animated) {&&&&&&&&[UIView animateWithDuration:0.35 animations:... completion:completion];&&&&} else {&&&&&&&&...&&&&&&&&completion(YES);&&&&}}
这样,就实现了我们的需求,思路比较简单,就是在window的最顶层添加一个View用于检测触摸事件,当检测到事件之后,根据当前条件来处理事件。
大家可以去我的github,里面有的相关的实现,使用方式在中可以看到。
可能感兴趣的话题
o 102 回复
关于iOS频道
iOS频道分享iOS和Swift开发,应用设计和推广,iOS相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线}

我要回帖

更多关于 绝地求生界面空白 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信