服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发中Subview的事件响应以及获取subview的方法

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

2020-12-24 15:28iOS开发网 IOS

这篇文章主要介绍了iOS开发中Subview的事件响应以及获取subview的方法,代码基于传统的Objective-C,需要的朋友可以参考下

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];


  运行可以看到如下界面:

 

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

获取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

 

iOS开发中Subview的事件响应以及获取subview的方法
例子中每个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的基本原则,即遵循深度优先,下层优先两个原则。

延伸 · 阅读

精彩推荐
  • IOSiOS中时间与时间戳的相互转化实例代码

    iOS中时间与时间戳的相互转化实例代码

    这篇文章主要介绍了iOS中时间与时间戳的相互转化实例代码,非常具有实用价值,需要的朋友可以参考下。...

    张无忌!4812021-03-09
  • IOSiOS10 Xcode8适配7个常见问题汇总

    iOS10 Xcode8适配7个常见问题汇总

    这篇文章主要为大家详细汇总了iOS10 Xcode8适配7个常见问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    索马里猫10332021-02-01
  • IOS谈一谈iOS单例模式

    谈一谈iOS单例模式

    这篇文章主要和大家谈一谈iOS中的单例模式,单例模式是一种常用的软件设计模式,想要深入了解iOS单例模式的朋友可以参考一下...

    彭盛凇11872021-01-19
  • IOSiOS常见的几个修饰词深入讲解

    iOS常见的几个修饰词深入讲解

    这篇文章主要给大家介绍了关于iOS常见的几个修饰词的相关资料,iOS修饰词包括assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite,文中通过示...

    郡王丶千夜7422021-05-10
  • IOSIOS网络请求之AFNetWorking 3.x 使用详情

    IOS网络请求之AFNetWorking 3.x 使用详情

    本篇文章主要介绍了IOS网络请求之AFNetWorking 3.x 使用详情,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    总李写代码6892021-03-04
  • IOSiOS APP实现微信H5支付示例总结

    iOS APP实现微信H5支付示例总结

    这篇文章主要介绍了iOS APP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    一张小A11332021-06-01
  • IOSxcode8提交ipa失败无法构建版本问题的解决方案

    xcode8提交ipa失败无法构建版本问题的解决方案

    xcode升级到xcode8后发现构建不了新的版本。怎么解决呢?下面小编给大家带来了xcode8提交ipa失败无法构建版本问题的解决方案,非常不错,一起看看吧...

    Cinna丶7542021-02-03
  • IOSiOS逆向教程之logify跟踪方法的调用

    iOS逆向教程之logify跟踪方法的调用

    这篇文章主要给大家介绍了关于iOS逆向教程之logify跟踪方法调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    Mr.Guo11472021-04-28