iOS 设置view的层级关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 设置view的层级关系相关的知识,希望对你有一定的参考价值。

参考技术A // 初始化第一个view并添加到当前控制器的view上;

UIView *first = [[UIView alloc] initWithFrame:CGRectMake(30, 30, 100, 100)];

first.backgroundColor = [UIColor redColor];

[self.view addSubview:first];

// 初始化第二个view并添加到当前控制器的view上;

UIView *second = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];

second.backgroundColor = [UIColor greenColor];

[self.view addSubview:second];

// 设置第一个view到最上层

[self.view bringSubviewToFront:first];

// 初始化第一个view并添加到当前控制器的view上;

UIView *first = [[UIView alloc] initWithFrame:CGRectMake(30, 30, 100, 100)];

first.backgroundColor = [UIColor redColor];

[self.view addSubview:first];

// 初始化第二个view并添加到当前控制器的view上;

UIView *second = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];

second.backgroundColor = [UIColor greenColor];

[self.view addSubview:second];

// 初始化第三个view并添加到当前控制器的view上;

UIView *third = [[UIView alloc] initWithFrame:CGRectMake(70, 70, 100, 100)];

third.backgroundColor = [UIColor yellowColor];

[self.view addSubview:third];

[self.view sendSubviewToBack:second];

// 设置第二个view到最下层

[self.view sendSubviewToBack:second];

// 初始化第一个view并添加到当前控制器的view上;

UIView *first = [[UIView alloc] initWithFrame:CGRectMake(30, 30, 100, 100)];

first.backgroundColor = [UIColor redColor];

[self.view addSubview:first];

// 初始化第二个view并添加到当前控制器的view上;

UIView *second = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];

second.backgroundColor = [UIColor greenColor];

[self.view addSubview:second];

// 初始化第三个view并添加到当前控制器的view上;

UIView *third = [[UIView alloc] initWithFrame:CGRectMake(30, 70, 100, 100)];

third.backgroundColor = [UIColor yellowColor];

[self.view addSubview:third];

// 设置第一个view在第一层;第二个在第三层;第三个在第四层;第四个在第二层

first.layer.zPosition = 1;  // red

second.layer.zPosition = 3; // green

third.layer.zPosition = 2;  // hello

Android上滑手势触发和不增加布局层级扩大点击区域

    最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听,在该View上的手势上滑会失效。

    如果这个View本身就是专门用于点击的,那并没有什么问题,可惜的是,这个View的尺寸不大,所以要求扩大点击区域。

    我们首先能想到的方法就是用一个容器将该View包起来,类似RelativeLayout,LinearLayout等,但这样布局的层级就会再加多一层。

    我们能否想到不用增加层级也能实现点击区域扩大的方法呢?

    GestureDetector是Android提供的手势操作类,它提供了单击,双击,长按等操作,并且会将这些事件传给onTouch,因此我们可以利用这个来判断触发单击事件的到底是哪个控件。

    但是我们的问题是扩大点击区域,而不是识别控件,因此需要知道用户的点击动作到底是落在哪个区域。

    所幸,MotionEvent提供了事件发生时候的坐标,这样我们就能知道单击时候的坐标,进一步确定是否在指定的区域范围内。

    MotionEvent是Android中触控方面编码的一个至关重要的类,它提供了用户在屏幕上的触控信息。我们可以通过MotionEvent获取到触控的事件类型,触控的坐标,并且现在已经支持多点触碰,还能进一步获取触控的索引信息。

    我们先上代码:

 1     @Override
 2     public boolean onTouch(View v, MotionEvent event) {
 3         if(event.getAction() == MotionEvent.ACTION_DOWN){
 4             int downX = (int)event.getX();
 5             int[] location = new int[2];
 6             ivMore.getLocationInWindow(location);
 7             if(Math.abs(downX - location[0]) <= 50){
 8                  ...
 9             }
10         }
11         return gestureDetector.onTouchEvent(event);
12     }

    我们先通过MotionEvent的getAction,获取到触控的事件类型,单击的类型为ACTION_DOWN,然后通过MotionEvent的getX获取到点击的x坐标,然后通过getLocationInWindow获取指定的View的坐标,这里指定该组件的x轴坐标正负50(表示左右范围)内为触发范围。

    我们现在可以不增加布局层级也能扩大点击范围了。

    利用GestureDetector实现上滑判断是很简单的,只要实现OnGestureListener接口,在对应的回调中进行我们指定的操作,不过因为GestureDetector本身并不捕获触控事件,所以要再实现onTouch事件,并调用GestureDetector的onTouchEvent,将对应的事件传过去。

    滑动的操作是在onFling回调中进行的,该回调会传进两个历史记录的MotionEvent,我们只要判断它们的Y轴坐标是否有变化即可。

    Android的触控是一个相当大的话题范围,我们只要在明确自己需求的前提上,去寻找对应的快捷解决方案。

    

以上是关于iOS 设置view的层级关系的主要内容,如果未能解决你的问题,请参考以下文章

iOS 查看层级关系以及调用堆栈

查看视图层级关系

小程序 video 层级,原生组件

h5 的canvas标签,画出的图形怎么设置他的层级关系。像css的z-index这样设置层级

添加约束的规则

为啥我在unity的层级里不能拖放东西