音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

iOS开发中Subview的事件响应以及获取subview的方法
日期:2015-09-29 10:15:21   来源:脚本之家

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的外边

//  但是消息的接受返回却是由于父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的基本原则,即遵循深度优先,下层优先两个原则。

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    Windows系统Linux系统苹果MACAndroidiOS系统鸿蒙系统