当前位置: 首页 > 编程笔记 >

iOS开发中Subview的事件响应以及获取subview的方法

巴帅
2023-03-14
本文向大家介绍iOS开发中Subview的事件响应以及获取subview的方法,包括了iOS开发中Subview的事件响应以及获取subview的方法的使用技巧和注意事项,需要的朋友参考一下

Subview的事件响应
在view的层级里面,默认情况下subview是可以显示到其父view的frame区域以外的,通过设置clipToBounds属性为YES,可以限制subview的显示区域。但是touch在各个UIView中传递的时候,区域时限制在view的frame内,此处包含两个信息:1、在当前view的frame以外所做的操作是不会传递到该view中的,这一点很容易理解。2、如果touch事件是发生在当前view的frame以外,该view所有的subview将也不会再收到该消息。这一点通常容易被我们忽略,很多奇怪的问题就是这个引起的。
 
  下面请看一个小例子,定制view的代码如下:
 


SvTestClipSubviewEvent.h

//

//  SvTestClipSubviewEvent.h

//  SvUIViewSample

//

//  Created by maple on 3/19/12.

//  Copyright (c) 2012 smileEvday. All rights reserved.

//

//  默认的情况下,subView可以超出父view的frame,即可以显示到父View的外边

//  但是消息的接受html" target="_blank">返回却是由于父View的大小限制,即出了父View的subView将不能收到消息

//  在程序中一定要注意当前程序view的最底层是充满整个window的可用区域的,

//  否则将会导致某些区域明明有按钮但是却点不中的问题

#import <UIKit/UIKit.h>

@interface SvTestClipSubviewEvent : UIView

@end


//

//  SvTestClipSubviewEvent.m

//  SvUIViewSample

//

//  Created by maple on 3/19/12.

//  Copyright (c) 2012 smileEvday. All rights reserved.

//

#import "SvTestClipSubviewEvent.h"

@interface SvTestClipSubviewEvent()

- (void)btnAction:(UIButton*)btn;

@end

@implementation SvTestClipSubviewEvent

- (id)initWithFrame:(CGRect)frame {        self = [super initWithFrame:frame];        if (self) {                // Initialization code                self.backgroundColor = [UIColor redColor];                        UIButton *testOutBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];                    testOutBtn.frame = CGRectMake(-80, -50, 70, 30);               [testOutBtn addTarget:self action:@selecto (btnAction: forControlEvents:UIControlEventTouchUpInside];                [testOutBtn setTitle:@"I'm out" forState:UIControlStateNormal];                [self addSubview:testOutBtn];                         UIButton *testInBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];                    testInBtn.frame = CGRectMake(20, 30, 70, 30);                [testInBtn setTitle:@"I'm in" forState:UIControlStateNormal];                [testInBtn addTarget:self action:@selector(btnAction: forControlEvents:UIControlEventTouchUpInside];                [self addSubview:testInBtn];        }        return self; }

/* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect {        // Drawing code } */

- (void)btnAction:(UIButton*)sender {        NSLog(@"HI, you tap button %@", [sender titleForState:UIControlStateNormal]); } @end


  在程序的ViewController中添加如下测试代码:
 


SvTestClipSubviewEvent *testClipSubView = [[SvTestClipSubviewEvent alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];

[self.view addSubview:testClipSubView];

[testClipSubView release]; 

  运行可以看到如下界面:

获取subview
通常我们在view层级里面对subView的操作可以通过两种方式:1、保留一个subview的引用,然后在类中通过该引用对该subview进行操作,但是要注意在适当的位置添加内存维护的代码,退出前手动释放。2、设置subview的Tag,让后在要使用的时候,通过viewWithTag获取到相应的subview,这种方法比较简洁,也不用自己去维护内存。
 
  ViewWithTag: 通常采用深度遍历优先的算法,返回第一个tag和给定Tag相等的subview。这就导致了一个当一个view的多个subview的tag相同的时候,我们通过该方法得到的view可能并不是自己想要的。
 
  下面通过一个小例子验证一下,代码如下:
 


//

//  SvTestViewTag.h

//  SvUIViewSample

//

//  Created by maple on 3/18/12.

//  Copyright (c) 2012 smileEvday. All rights reserved.

//

//  view根据Tag获取subView的时候执行的是深度优先遍历的算法

//  返回第一个Tag和请求tag相等的子View

//  从subViews中查找,最下层的优先找到

#import <UIKit/UIKit.h>

@interface SvTestViewWithTag : UIView

@end


例子中每个subview都是一个UILabel,而且设置了相应的内容。按钮的响应函数的实现思路:首先隐藏所有类型为UILabel的subview(排除UIButton,因为button需要一直显示),然后根据指定的Tag获取到相应的subview,该subview及其superView的hidden属性为NO。这样就可以保证点击按钮的时候只显示的是第一个tag和指定tag相等的subview。
 
  为了验证viewWithTag获取subview的原理:
 
  首先我在subview1中添加了两个tag都为11的subview11和subview12。 运行程序可以,当我们点击"Show Tag 11"按钮的时候屏幕上将显示“SubView11”,而非“SubView12”。同时不管你点击几次该按钮,始终只显示“SubView11”。这样可以看出来同一层级中获取subview时候查找顺序为index从小到大的原则,即位于相对下层的将首先被找到。
 
  其次我还在subview1中添加了tag均为13的subview13,同时向view中添加了tag也为13的subview2,运行程序点击“Show Tag 13”按钮,屏幕上将会显示“SubView13”,而非“SubView2”。这可以验证viewWithTag在搜索的时候遵循深度优先遍历的原则,即会首先查找最下层的view并递归查询其subview。
 
  综上两点我们可以看出来viewWithTag获取subview的基本原则,即遵循深度优先,下层优先两个原则。

 类似资料:
  • 本文向大家介绍MFC中动态创建控件以及事件响应实现方法,包括了MFC中动态创建控件以及事件响应实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考。具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。 一、创建动态控件:   为了对照,我们先来看一下静态控件的创建。  

  • 本文向大家介绍理解iOS多线程应用的开发以及线程的创建方法,包括了理解iOS多线程应用的开发以及线程的创建方法的使用技巧和注意事项,需要的朋友参考一下 一、进程和线程 1.什么是进程   进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ、Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程

  • 本文向大家介绍IOS开发之手势响应事件优先级的实例详解,包括了IOS开发之手势响应事件优先级的实例详解的使用技巧和注意事项,需要的朋友参考一下 IOS开发之手势响应事件优先级的实例详解 交互响应事件都是通过手势的操作完成的,如点击、或双击、或长按,这些交互都是在视图中完成的,但是不同的视图可能会有不同的交互,有时候就会出现交互响应事件冲突的情况。这时候就需要处理事件优先级,以便达到想要的效果。 示

  • 本文向大家介绍PyQt5响应回车事件的方法,包括了PyQt5响应回车事件的方法的使用技巧和注意事项,需要的朋友参考一下 我在编程时遇到一个问题,就是PyQt5不能响应回车时间,也就是下面这段代码不能执行: 解决方法:打印出事件码: 然后直接判断事件码: 以上这篇PyQt5响应回车事件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍iOS 响应者链的事件传递过程?相关面试题,主要包含被问及iOS 响应者链的事件传递过程?时的应答技巧和注意事项,需要的朋友参考一下 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,则其将事件或消息传递给UIAp

  • 我使用了Web API控制器中的IActionResult和邮递员的加热方法,我的功能正在工作,但没有得到成功响应。我的代码是: Postman中的响应是:无法获得任何响应连接到https://localhost:44303/api/pousada/markasinactive时出错。可能发生这种情况的原因:服务器无法发送响应:确保后端正常工作自签名SSL证书被阻止:通过关闭设置>常规代理配置错误