亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

iOS開發(fā)中Subview的事件響應(yīng)以及獲取subview的方法

 更新時(shí)間:2015年09月29日 10:15:21   投稿:goldensun  
這篇文章主要介紹了iOS開發(fā)中Subview的事件響應(yīng)以及獲取subview的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下

Subview的事件響應(yīng)
在view的層級里面,默認(rèn)情況下subview是可以顯示到其父view的frame區(qū)域以外的,通過設(shè)置clipToBounds屬性為YES,可以限制subview的顯示區(qū)域。但是touch在各個(gè)UIView中傳遞的時(shí)候,區(qū)域時(shí)限制在view的frame內(nèi),此處包含兩個(gè)信息:1、在當(dāng)前view的frame以外所做的操作是不會傳遞到該view中的,這一點(diǎn)很容易理解。2、如果touch事件是發(fā)生在當(dāng)前view的frame以外,該view所有的subview將也不會再收到該消息。這一點(diǎn)通常容易被我們忽略,很多奇怪的問題就是這個(gè)引起的。
 
  下面請看一個(gè)小例子,定制view的代碼如下:
 

復(fù)制代碼 代碼如下:

SvTestClipSubviewEvent.h


//

//  SvTestClipSubviewEvent.h

//  SvUIViewSample

//

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

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

//

//  默認(rèn)的情況下,subView可以超出父view的frame,即可以顯示到父View的外邊

//  但是消息的接受返回卻是由于父View的大小限制,即出了父View的subView將不能收到消息

//  在程序中一定要注意當(dāng)前程序view的最底層是充滿整個(gè)window的可用區(qū)域的,

//  否則將會導(dǎo)致某些區(qū)域明明有按鈕但是卻點(diǎn)不中的問題

#import <UIKit/UIKit.h>

@interface SvTestClipSubviewEvent : UIView

@end

復(fù)制代碼 代碼如下:

//
//  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中添加如下測試代碼:
 

復(fù)制代碼 代碼如下:

SvTestClipSubviewEvent *testClipSubView = [[SvTestClipSubviewEvent alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
[self.view addSubview:testClipSubView];
[testClipSubView release];

  運(yùn)行可以看到如下界面:

獲取subview
通常我們在view層級里面對subView的操作可以通過兩種方式:1、保留一個(gè)subview的引用,然后在類中通過該引用對該subview進(jìn)行操作,但是要注意在適當(dāng)?shù)奈恢锰砑觾?nèi)存維護(hù)的代碼,退出前手動釋放。2、設(shè)置subview的Tag,讓后在要使用的時(shí)候,通過viewWithTag獲取到相應(yīng)的subview,這種方法比較簡潔,也不用自己去維護(hù)內(nèi)存。
 
  ViewWithTag: 通常采用深度遍歷優(yōu)先的算法,返回第一個(gè)tag和給定Tag相等的subview。這就導(dǎo)致了一個(gè)當(dāng)一個(gè)view的多個(gè)subview的tag相同的時(shí)候,我們通過該方法得到的view可能并不是自己想要的。
 
  下面通過一個(gè)小例子驗(yàn)證一下,代碼如下:
 

復(fù)制代碼 代碼如下:

//
//  SvTestViewTag.h
//  SvUIViewSample
//
//  Created by maple on 3/18/12.
//  Copyright (c) 2012 smileEvday. All rights reserved.
//
//  view根據(jù)Tag獲取subView的時(shí)候執(zhí)行的是深度優(yōu)先遍歷的算法
//  返回第一個(gè)Tag和請求tag相等的子View
//  從subViews中查找,最下層的優(yōu)先找到

#import <UIKit/UIKit.h>

@interface SvTestViewWithTag : UIView

@end


例子中每個(gè)subview都是一個(gè)UILabel,而且設(shè)置了相應(yīng)的內(nèi)容。按鈕的響應(yīng)函數(shù)的實(shí)現(xiàn)思路:首先隱藏所有類型為UILabel的subview(排除UIButton,因?yàn)閎utton需要一直顯示),然后根據(jù)指定的Tag獲取到相應(yīng)的subview,該subview及其superView的hidden屬性為NO。這樣就可以保證點(diǎn)擊按鈕的時(shí)候只顯示的是第一個(gè)tag和指定tag相等的subview。
 
  為了驗(yàn)證viewWithTag獲取subview的原理:
 
  首先我在subview1中添加了兩個(gè)tag都為11的subview11和subview12。 運(yùn)行程序可以,當(dāng)我們點(diǎn)擊"Show Tag 11"按鈕的時(shí)候屏幕上將顯示“SubView11”,而非“SubView12”。同時(shí)不管你點(diǎn)擊幾次該按鈕,始終只顯示“SubView11”。這樣可以看出來同一層級中獲取subview時(shí)候查找順序?yàn)閕ndex從小到大的原則,即位于相對下層的將首先被找到。
 
  其次我還在subview1中添加了tag均為13的subview13,同時(shí)向view中添加了tag也為13的subview2,運(yùn)行程序點(diǎn)擊“Show Tag 13”按鈕,屏幕上將會顯示“SubView13”,而非“SubView2”。這可以驗(yàn)證viewWithTag在搜索的時(shí)候遵循深度優(yōu)先遍歷的原則,即會首先查找最下層的view并遞歸查詢其subview。
 
  綜上兩點(diǎn)我們可以看出來viewWithTag獲取subview的基本原則,即遵循深度優(yōu)先,下層優(yōu)先兩個(gè)原則。

相關(guān)文章

  • iOS tableView實(shí)現(xiàn)單選和多選的實(shí)例代碼

    iOS tableView實(shí)現(xiàn)單選和多選的實(shí)例代碼

    本篇文章主要介紹了iOS tableView實(shí)現(xiàn)單選和多選的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Xcode8、iOS10升級問題記錄

    Xcode8、iOS10升級問題記錄

    本文給大家分享xcode8,ios10升級后的問題記錄,可以幫大家到家更好的解決xcode,ios10升級遇到問題,感興趣的朋友一起看看吧
    2016-09-09
  • iOS實(shí)現(xiàn)百度地圖定位簽到功能

    iOS實(shí)現(xiàn)百度地圖定位簽到功能

    這篇文章主要給大家介紹了iOS實(shí)現(xiàn)百度地圖定位簽到功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • IOS定制屬于自己的個(gè)性頭像

    IOS定制屬于自己的個(gè)性頭像

    這篇文章主要為大家介紹了IOS定制屬于自己的個(gè)性頭像,實(shí)現(xiàn)方法很簡單,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 詳解iOS使用Keychain中的kSecClassGenericPassword存儲數(shù)據(jù)

    詳解iOS使用Keychain中的kSecClassGenericPassword存儲數(shù)據(jù)

    iOS設(shè)備中的Keychain是一個(gè)安全的存儲容器,本篇文章主要介紹了iOS使用Keychain中的kSecClassGenericPassword存儲數(shù)據(jù),有興趣的可以了解一下。
    2016-11-11
  • iOS如何優(yōu)雅地實(shí)現(xiàn)序列動畫詳解

    iOS如何優(yōu)雅地實(shí)現(xiàn)序列動畫詳解

    這篇文章主要給大家介紹了關(guān)于iOS如何優(yōu)雅地實(shí)現(xiàn)序列動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • iOS Webview自適應(yīng)實(shí)際內(nèi)容高度的4種方法詳解

    iOS Webview自適應(yīng)實(shí)際內(nèi)容高度的4種方法詳解

    這篇文章主要介紹了iOS Webview自適應(yīng)實(shí)際內(nèi)容高度的4種方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • iOS中各種UI控件屬性設(shè)置示例代碼

    iOS中各種UI控件屬性設(shè)置示例代碼

    這篇文章主要給大家介紹了關(guān)于iOS中各種UI控件屬性設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • iOS實(shí)現(xiàn)手動和自動屏幕旋轉(zhuǎn)

    iOS實(shí)現(xiàn)手動和自動屏幕旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)手動和自動屏幕旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 詳解iOS中多線程app開發(fā)的GCD隊(duì)列的使用

    詳解iOS中多線程app開發(fā)的GCD隊(duì)列的使用

    這篇文章主要介紹了詳解iOS中多線程app開發(fā)的GCD隊(duì)列的使用,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-12-12

最新評論