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的根本准繩,即遵守深度優先,基層優先兩個准繩。
【iOS開辟中Subview的事宜呼應和獲得subview的辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!