iOS 디자인 의 UIWindow 사용 에 대한 자세 한 설명

9784 단어 iOS
모든 IOS 프로그램 에는 UIWindow 가 있 습 니 다.템 플 릿 이력서 프로젝트 를 통과 할 때 xcode 는 자동 으로 window 를 만들어 서 keyWindow 로 만들어 표시 합 니 다.이 모든 것 이 자 연 스 러 워 서 우 리 는 대부분 자신 도 UIWindow 대상 을 만 들 수 있다 는 것 을 무시 했다.
 
일반적으로 사용자 정의 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 가 숨 어 있다
 
전체적으로'막후 에 은거 하려 면 되 지만 권 리 를 먼저 내 놓 아야 한다'는 것 이다.

좋은 웹페이지 즐겨찾기