iOS 디자인 의 UIWindow 사용 에 대한 자세 한 설명
9784 단어 iOS
일반적으로 사용자 정의 UIAlertView 가 필요 할 때(IOS 5.0 이전 AlertView 의 배경 스타일 등 은 바 꿀 수 없 음)우 리 는 UIWindow 를 사용 하여 실현 할 수 있 습 니 다(windowLevel 을 Alert 등급 으로 설정).인터넷 에는 많은 예 가 있 습 니 다.여 기 는 자세히 말 하지 않 겠 습 니 다.
1.UIWindowLevel
우 리 는 모두 UIWindow 가 세 개의 등급 이 있 는데 그것 이 바로 Normal,StatusBar,Alert 라 는 것 을 안다.인쇄 출력 그들 세 개의 이 세 개의 등급 의 값 을 우 리 는 왼쪽 에서 오른쪽으로 0,1000,2000 순 으로 나 타 났 다.즉,Normal 등급 이 가장 낮 고 StatusBar 는 중간 수준 에 있 으 며 Alert 등급 이 가장 높다 는 것 을 발견 했다.일반적으로 우리 프로그램의 인 터 페 이 스 는 Normal 이라는 단계 에 있 습 니 다.시스템 상단 의 상태 표시 줄 은 StatusBar 단계 에 있어 야 합 니 다.UIActionSheet 과 UIAlertView 는 보통 정상 적 인 절 차 를 중단 하고 사용자 에 게 알 리 는 등 작업 을 하기 때문에 Alert 단계 에 있 습 니 다.
지난 글 에서 나 도 세 단계 의 값 이 1000 차이 가 나 고 우리 가 자세히 살 펴 보면 UIWindow 의 헤더 파일 을 보면 인 스 턴 스 변수 가 있 을 것 이 라 고 추측 했다.windowSublevel,그러면 우 리 는 많은 중간 등급 의 Window 를 정의 할 수 있 습 니 다.예 를 들 어 시스템 UIAlertView 보다 낮은 window 를 사용자 정의 할 수 있 습 니 다.그래서 작은 demo 를 썼 습 니 다.인쇄 를 통 해 시스템 의 UIAlertView 단 계 는 1996 이 고 UIAction Sheet 의 단 계 는 2001 입 니 다.이렇게 해서 subLevel 이 존재 한 다 는 것 을 검 증 했 습 니 다.
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert View"
message:@"Hello Wolrd, i'm AlertView!!!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:@"Cancel", nil];
[alertView show];
[alertView release];
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"ActionSheet"
delegate:nil
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:@"Don't do that!"
otherButtonTitles:@"Hello Wolrd", nil];
[actionSheet showInView:self.view];
[actionSheet release];
다음은 프로그램 실행 캡 처 입 니 다.window 디 스 플레이 등급 우선 원칙 에 따라 등급 이 높 은 것 은 위 에 표시 되 고 등급 이 낮은 것 은 아래 에 표 시 됩 니 다.우리 프로그램 이 정상적으로 표시 하 는 view 는 맨 밑 에 있 습 니 다.UIAlertView 와 UIAction Sheet 의 level 을 어떻게 얻 는 지 에 대해 서 는 아래 두 번 째 부분 keyWindow 에서 해당 하 는 코드 를 소개 하고 드 리 겠 습 니 다.
UIWindow 는 표시 할 때 UIWindow Level 에 따라 정렬 됩 니 다.즉,Level 이 높 은 것 은 모든 Level 이 그 보다 낮은 등급 의 앞 에 있 습 니 다.다음은 UIWindowLevel 의 정 의 를 살 펴 보 겠 습 니 다.
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS 시스템 에서 세 개의 window 등급 을 정 의 했 는데 그 중에서 각 등급 은 여러 개의 하위 등급 으로 나 눌 수 있 습 니 다(UIWindow 의 헤더 파일 에서 구성원 변 수 를 볼 수 있 습 니 다 CGFloatwindowSublevel;),그러나 시스템 은 속성 을 열지 않 았 다.UIWindow 의 기본 단 계 는 UIWindow Level Normal 입 니 다.출력 세 level 의 값 은 다음 과 같 습 니 다.
2012-03-27 22:46:08.752 UIViewSample[395:f803] Normal window level: 0.000000
2012-03-27 22:46:08.754 UIViewSample[395:f803] Alert window level: 2000.000000
2012-03-27 22:46:08.755 UIViewSample[395:f803] Status window level: 1000.000000
이렇게 하면 그들의 등급 의 높 고 낮 음 순서 가 어 릴 때 부터 Normal
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor yellowColor];
[self.window makeKeyAndVisible];
UIWindow *normalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
normalWindow.backgroundColor = [UIColor blueColor];
normalWindow.windowLevel = UIWindowLevelNormal;
[normalWindow makeKeyAndVisible];
CGRect windowRect = CGRectMake(50,
50,
[[UIScreen mainScreen] bounds].size.width - 100,
[[UIScreen mainScreen] bounds].size.height - 100);
UIWindow *alertLevelWindow = [[UIWindow alloc] initWithFrame:windowRect];
alertLevelWindow.windowLevel = UIWindowLevelAlert;
alertLevelWindow.backgroundColor = [UIColor redColor];
[alertLevelWindow makeKeyAndVisible];
UIWindow *statusLevelWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 320, 20)];
statusLevelWindow.windowLevel = UIWindowLevelStatusBar;
statusLevelWindow.backgroundColor = [UIColor blackColor];
[statusLevelWindow makeKeyAndVisible];
NSLog(@"Normal window level: %f", UIWindowLevelNormal);
NSLog(@"Alert window level: %f", UIWindowLevelAlert);
NSLog(@"Status window level: %f", UIWindowLevelStatusBar);
return YES;
}
다음 그림 과 같이 실행 결과:
우 리 는 두 가 지 를 주의 할 수 있다.
1)우리 가 만 든 normalWindow 는 첫 번 째 기본 window 이후 MakeKey AndVisible 을 호출 했 지만 표시 되 지 않 았 습 니 다.이 는 Level 등급 이 같 을 때 첫 번 째 로 KeyWindow 로 설 정 된 것 만 표시 되 고,뒤의 같은 등급 의 재 설정 KeyWindow 도 표시 되 지 않 는 다 는 뜻 이다.
2)status LevelWindow 는 alertLevelWindow 이후 MakeKey AndVisible 을 호출 하여 alertLevelWindow 아래 에 만 표 시 됩 니 다.이 는 UIWindow 가 표시 할 때 KeyWindow 가 누구 든 Level 이 우선 이라는 것 을 의미한다.즉,Level 이 가장 높 은 것 은 항상 맨 앞 에 나타난다.
2.KeyWindow
keyWindow 가 무엇 인지 공식 문서 에 서 는"The key window is the one that is designated to receive keyboard and other non-touch related events.Only one window at a time may be the key window"라 고 설명 합 니 다.그리고 프로그램 에 서 는 매 시간 하나의 window 만 키 Window 입 니 다.
키 윈도 가 아 닌 키보드 메시지 와 터치 메 시 지 를 받 아들 일 수 있 는 지 간단 한 예 를 들 어 보 겠 습 니 다.프로그램 에 UITextField 를 추가 한 다음 alert 급 window 를 새로 만 든 다음 MakeKey AndVisible 을 통 해 키 윈도 로 표시 합 니 다.코드 는 다음 과 같 습 니 다:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.viewController = [[[SvUIWindowViewController alloc] initWithNibName:@"SvUIWindowViewController" bundle:nil] autorelease];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 80, 320, 320)];
window1.backgroundColor = [UIColor redColor];
window1.windowLevel = UIWindowLevelAlert;
[window1 makeKeyAndVisible];
return YES;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self registerObserver];
// add a textfield
UITextField *filed = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 320, 60)];
filed.placeholder = @"Input something here";
filed.clearsOnBeginEditing = YES;
filed.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:filed];
[filed release];
}
캡 처 실행:그림 에서 알 수 있 듯 이 우리 스스로 하 나 를 새로 만 들 고 키 윈도 우 로 설정 하여 표시 하지만 프로그램 에 기본 윈도 우 에 추 가 된 textField 를 누 르 면 키 보드 를 불 러 올 수 있 고 키보드 입력 도 정상적으로 받 아들 일 수 있 습 니 다.키보드 만 가 려 져 있 습 니 다.키 윈도 우 가 아 닌 것 도 키보드 메 시 지 를 받 아들 일 수 있다 는 것 은 문서 에서 말 한 것 과 다 릅 니 다.
UIWindow 의 문 서 를 살 펴 보면 window 변화 에 대한 네 가지 알림 이 있 습 니 다.
UIWindowDidBecomeVisibleNotification
UIWindowDidBecomeHiddenNotification
UIWindowDidBecomeKeyNotification
UIWindowDidResignKeyNotification
이 네 개의 알림 대상 중 object 는 현재 표시(숨 김)되 어 있 으 며,keyWindow(비 keyWindow)의 window 대상 이 되 었 으 며,userInfo 는 비어 있 습 니 다.그래서 우 리 는 이 네 가지 메 시 지 를 등록 하고 정 보 를 인쇄 하여 keyWindow 의 변화 와 window 의 표시,숨겨 진 변동 을 관찰 할 수 있 습 니 다.
코드 는 다음 과 같 습 니 다:
인쇄 된 정보 에 근거 하여 우 리 는 절차 가 다음 과 같다 는 것 을 알 수 있다.
1.프로그램 기본 window 먼저 표시
2,기본 window 다시 keyWindow
3.AlertView 의 window 표시
4.기본 window 가 비 keyWindow 로 변 함
5.최종 AlertView 의 window 가 keyWindow 로 변 합 니 다.
전체적으로 말 하면'첫째(keyWindow)가 되 려 면 동생(비 keyWindow)부터 섞 어 라'는 것 이다.또한 인쇄 된 정보 에 따 르 면 우리 동료 들 은 기본 window 의 level 이 0,즉 normal 등급 이라는 것 을 알 수 있다.AlertView 의 window level 은 1996 로 Alert 보다 약간 낮 았 다.
b.viewDidAppear 에서"[self presentActionSheet];"콘 솔 출력 은 다음 과 같 습 니 다.
keyWindow 의 변 화 는 window 의 디 스 플레이 와 위의 절차 와 마찬가지 로 Action Sheet 의 window level 이 2001 이라는 것 을 알 수 있 습 니 다.
c.다음 단계 에서 ActionSheet 의 cancel 을 팝 업 할 때 콘 솔 출력 은 다음 과 같 습 니 다.
우 리 는 절차 가 다음 과 같다 는 것 을 알 았 다.
1.우선 ActionSheet 의 window 가 비 keyWindow 로 변 합 니 다.
2.프로그램의 기본 window 가 keyWindow 로 변 합 니 다.
3、Action Sheet 의 window 가 숨 어 있다
전체적으로'막후 에 은거 하려 면 되 지만 권 리 를 먼저 내 놓 아야 한다'는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.