2011-03-17 4 views
2

내 응용 프로그램에서 기본적으로 상태 표시 줄이 표시됩니다. 그리고 내 응용 프로그램은 가로 방향과 세로 방향을 지원합니다. 동영상을 재생하고 싶을 때 상태 표시 줄을 숨겨서 내 동영상이 전체 화면으로 표시됩니다. 비디오가 완료되면 상태 표시 줄을 다시 가져옵니다.iPhone - 전체 화면 및 상태 표시 줄의 일반적인 문제

나는 비디오 보여주기 위해 다음 코드를 사용하고 있습니다 :

UIWindow* window = [[UIApplication sharedApplication] keyWindow]; 
[window addSubview:playerView]; 

(내 코드에서 뷰 컨트롤러를 사용할 수 없습니다 그 제한입니다.) 이제

문제 : 내 애플입니다 지금 가로로 버튼을 클릭하면 상태 표시 줄을 숨기고 비디오 재생을 시작합니다. 동영상이 재생 중일 때 휴대 전화의 방향을 세로로 변경하고 동영상이 완료되도록 허용했습니다. 비디오가 완료되면 장치는 여전히 세로 모드로 유지되며 플레이어보기가 제거되고 상태 표시 줄이 다시 표시됩니다. 이제 세로보기가 상태 표시 줄이 20 픽셀 이상 위로 이동하는 것을 보았습니다. 그러나 전나무 시간대에 앱을 시작하면 상태 표시 줄이 처음과 그 아래에 표시되며 내보기가 표시됩니다.

이 상황을 어떻게 처리해야합니까?

간단히보기 컨트롤러에서 다음 코드를 사용하십시오.

- (void)viewDidLoad { 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    [self performSelector:@selector(showStatusAgain) withObject:nil afterDelay:6.0]; 
    [super viewDidLoad]; 
} 

-(void)showStatusAgain 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
} 


// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

위의 코드로 앱을 실행하면 세로로 시작됩니다. 이제 풍경으로 회전하십시오. 문제를 확인할 수 있습니다.

+0

당신은 그냥 시도 .... didRotateFrominterfaceOrientation 방법도있는 viewDidLoad에서보기의 프레임을 설정하려고 할 수 있습니다 될 수있다 그것을 밖으로 확인하고 위치를 확인 ... –

+0

약간의 코드가 확실히 도움이 될 것입니다. – visakh7

+0

안녕하세요 7KV7, 상태 표시 줄에 방향 문제가 발생하는 샘플 코드를 추가했습니다. – Satyam

답변

6

비슷한 문제가 발생하여 UINavigationController에서 범주를 해결했습니다.

UINavigationController가 + LayoutCorrecting.h :

@interface UINavigationController (LayoutCorrecting) 

- (void)recalculateNavigationBarFrameRelativeToStatusBar; 

@end 

UINavigationController가 + LayoutCorrecting.m :

#import "UINavigationBar+LayoutCorrecting.h" 

#import "UIViewAdditions.h" 

@implementation UINavigationController (LayoutCorrecting) 

- (void)recalculateNavigationBarFrameRelativeToStatusBar { 
    CGRect sbf = [[UIApplication sharedApplication] statusBarFrame]; 

    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) 
     self.navigationBar.top = sbf.size.width; 

    else 
     self.navigationBar.top = sbf.size.height; 
} 

@end 

당신의 UIViewController에 선언하고, 확인이 컨트롤러를 조정하여이 범주를 조금 조정할 경우. navigationBar.top 대신 view.frame을 사용하면 좋을 것이라고 생각합니다. 동영상 재생이 끝나고 상태 표시 줄을 이미 본 후에는보기 컨트롤러에서 카테고리 메소드를 호출해야합니다.

그리고 단지 혼란을 구멍 뚫림을 위해서

, 그것은 UIWindow의 항상 작품은 세로의 것처럼 시스템 을 조정하기 때문에, 당신은 유지 방법에도 불구하고 가로 모드 상태 표시 줄의 폭을 사용할 필요가 언급 아마 가치 장치. UIViewController에 의해 관리되는 하위 뷰 (UIView 인스턴스)와는 대조적으로 자동 좌표 변환의 이점을 누립니다.

P .: Windows 컨텍스트에서보기 프레임을 조정해야하므로이 기능이 도움이 될 수 있습니다.

CGRect CGRectOffsetRectForOrientation(CGRect rect, CGFloat dx, CGFloat dy, UIInterfaceOrientation orientation) { 
    CGRect newRect = rect; 

    switch (orientation) { 
     case UIInterfaceOrientationPortrait: 
      newRect.origin.x += dx; 
      newRect.origin.y += dy; 
      break; 

     case UIInterfaceOrientationPortraitUpsideDown: 
      newRect.origin.x -= dx; 
      newRect.origin.y -= dy; 
      break; 

     case UIInterfaceOrientationLandscapeLeft: 
      newRect.origin.y -= dx; 
      newRect.origin.x += dy; 
      break; 

     case UIInterfaceOrientationLandscapeRight: 
      newRect.origin.y += dx; 
      newRect.origin.x -= dy; 
      break; 

     default: 
      break; 
    } 

    return newRect; 
} 
+0

내비게이션 컨트롤러를 사용할 수 없습니다 – Satyam

+0

나머지 게시물 읽기 - 일부 어셈블리가 필요합니다. –

0

시도는 당신이 그것을 보여줄 때 상태 표시 줄 스타일을 업데이트 :

[[UIApplication sharedApplication] setStatusBarHidden:NO]; 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefualt]; 
+0

이렇게해도 문제가 해결되지 않았습니다. – Satyam

관련 문제