自定义View 跳转不同界面方法

自定义View 跳转不同界面方法

有时候,我们在自定义UIView 的时候 , 很有可能 会在这个View 进行页面跳转,但是, 你会发现, 那些 push 和 pop 方法 都没什么用 ,那是因为 当一个子view需要接收点击事件,而父view也需要接收点击事件

当然,你可能会说直接调用mysubview.superView即可,这样做也确实是可以做到,但有时子view是不一定知道有这个特定的父view的存在的,如动态添加子view。

所以这里就用到了事件处理与传递。

简单介绍一下

  • ios当中常用的事件?
1
2
3
- 触摸事件
- 加速计事件
- 远程控制事件
  • 什么是响应者对象?
1
2
3
继承了UIResponds的对象我们称它为响应者对象
UIApplication、UIViewController、UIView都继承自UIResponder
因此它们都是响应者对象,都能够接收并处理事件
  • 事件是怎么样产生与传递的?
1
2
3
4
5
当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中.
UIApplication会从事件队列中取出最前面的事件,交给主窗口.
主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件
触摸事件的传递是从父控件传递到子控件的.
如果一个父控件不能接收事件,那么它里面的了子控件也不能够接收事件.
  • 一个控件什么情况下不能够接收事件?
1
2
3
4
5
6
7
8
9
- 不接收用户交互时不能够处理事件

userInteractionEnabled = NO
- 当一个控件隐藏的时候不能够接收事件

Hidden = YES的时候
- 当一个控件为透明白时候也不能够接收事件

alpha <=0.01
注意:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
  • 如何寻找最合适的View?
1
2
3
4
- 先判断自己是否能够接收触摸事件,如果能再继续往下判断,
- 再判断触摸的当前点在不在自己的身上.
- 如果在自己身上,UIWindow会从后往前(后创建的子控件开始)遍历子控件,遍历出每一个子控件后,重复前面的两个步骤.
- 如果没有符合条件的子控件,那么它自己就是最适合的View.

回到主题上来,下面要做的也就是,让子view接收这些事件后,同时把这些事件继续向上传,会一直传到UIApplication为止。而在传的过程中,如果子view接收了这些事件,那么事件会自然终止,我们现在可以做的是同时让子view接收事件,而且还让事件不终止,并继续向上传。

步骤应该是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//定义一个全局变量    
UIViewController *superVC;

//然后执行这个方法
- (UIViewController *)viewController:(UIView *)view{

UIResponder *responder = view;
while ((responder = [responder nextResponder]))
if ([responder isKindOfClass: [UIViewController class]]){
return (UIViewController *)responder;
}
return nil;
}

//最后,在你跳转页面的方法中
superVC = [self viewController:self];

[superVC.navigationController pushViewController:(UIViewController) animated:YES];

这样就可以跳转页面了.