2012-05-14 1 views
1

신청서 하단에 특정 시간에 상태 표시 줄을 표시해야한다는 요구 사항이 있습니다. 이 응용 프로그램의 기본보기의 맨 아래에이 쉽게 넣을 수 있지만이 (상단 모서리 또는 그렇지 않은)보기 컨트롤러를 밀어 때마다이 상태 표시 줄을 숨 깁니다.앱 외부의 화면 하단에 앱 별 상태 표시 줄을 표시하는 방법은 무엇입니까?

이와 같은 상태 표시 줄을 추가 할 수있는 방법이 있습니까? 내 응용 프로그램 자체의 경계 밖에 있어야합니까? 이상적으로는 iPhone의 통화 중 상태 표시 줄처럼 작동하고 싶습니다.이 막대가 나타나면 앱이 아래로 밀리고 [[UIScreen mainScreen] applicationFrame]으로 전화하면 올바른 크기가 반환됩니다 (즉, 앱에서 사용할 수있는 높이를 계산할 때 상태 표시 줄).

답변

1

나는이 작업도하고 싶었 기 때문에 시도했습니다. View Controller Containment. 나는 여전히 그것을 시험 중이다. 그래서 나는 이것을 호의적 인지지로 기꺼이 포기하지 않을 것이지만, 만약 당신이 iOS5에 있다면 당신 자신과 함께 놀고 싶은 뭔가일지도 모른다. 그러나 화면 하단에 표시되거나 사라지는 상태 표시 줄이 나타납니다.

이것은 다른보기 컨트롤러를 열리는보기 컨트롤러이지만 표시 할 상태 텍스트가 있으면 화면 아래쪽에서 팝업되어 제거 될 때까지 거기에 머물러 있습니다. 지금까지는 약간의 테스트 만 수행했지만이 핸들은 pushViewController/popViewController이지만 모달 뷰가 아닌 것 같습니다. 다음

// StatusBarViewController.m 
// 
// Created by Robert Ryan on 7/8/12. 

#import "StatusBarViewController.h" 

@interface StatusBarViewController() 
{ 
    BOOL _statusHidden; 
    UIView *_appView; 
    UILabel *_statusLabel; 
} 
@end 

@implementation StatusBarViewController 

@synthesize appController = _appController; 

- (void)dealloc 
{ 
    _appView = nil; 
    _statusLabel = nil; 

    [self setAppController:nil]; // usually I don't like setters in dealloc, but this does some special stuff 
} 

- (void)createControlsWithStatusHidden 
{ 
    // create default app view that takes up whole screen 

    CGRect frame = self.view.frame; 
    frame.origin = CGPointMake(0.0, 0.0); 
    _appView = [[UIView alloc] initWithFrame:frame]; 
    _appView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    _appView.clipsToBounds = YES; 
    [self.view addSubview:_appView]; 

    // create status label that is just off screen below the app view 

    _statusLabel = [[UILabel alloc] init]; 
    _statusLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0]; 
    _statusLabel.backgroundColor = [UIColor darkGrayColor]; 
    _statusLabel.textColor = [UIColor whiteColor]; 
    CGSize size = [@"Hey!" sizeWithFont:_statusLabel.font]; // test size of box with random text 
    _statusLabel.frame = CGRectMake(0.0, frame.size.height, frame.size.width, size.height); 
    _statusLabel.textAlignment = UITextAlignmentCenter; 
    _statusLabel.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth; 
    [self.view addSubview:_statusLabel]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self createControlsWithStatusHidden]; 
    _statusHidden = YES; 

    // I'm instantiating from storyboard. If you're using NIBs, just create your controller controller using initWithNib and then set our appController accordingly. 

    self.appController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavigator"]; 
} 

- (void)setAppController:(UIViewController *)controller 
{ 
    if (controller) 
    { 
     controller.view.frame = CGRectMake(0.0, 0.0, _appView.frame.size.width, _appView.frame.size.height); 
     [self addChildViewController:controller]; 
     [controller didMoveToParentViewController:self]; 

     if (self.appController) 
     { 
      // if we have both a new controller and and old one, then let's transition, cleaning up the old one upon completion 

      [self transitionFromViewController:self.appController 
           toViewController:controller 
             duration:0.5 
             options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionCurveEaseInOut 
            animations:nil 
            completion:^(BOOL finished){ 
             if (self.appController) 
             { 
              [self.appController willMoveToParentViewController:nil]; 
              [self.appController removeFromParentViewController]; 
             } 
            }]; 
     } 
     else 
     { 
      // if we have no previous controller (i.e. this is our first rodeo), then just add it to the view 

      [_appView addSubview:controller.view]; 
     } 
    } 
    else 
    { 
     // no new controller, so we're just removing any old on if it was there 

     if (self.appController) 
     { 
      // if there was an old controller, remove it's view, and remove it from the view controller hierarchy 

      [self.appController.view removeFromSuperview]; 
      [self.appController willMoveToParentViewController:nil]; 
      [self.appController removeFromParentViewController]; 
     } 
    } 

    _appController = controller; 
} 

- (void)hideStatusWithCompletion:(void (^)(BOOL finished))completion 
{ 
    [UIView animateWithDuration:0.25 
        animations:^{ 
         CGRect labelFrame = _statusLabel.frame; 
         labelFrame.origin.y += labelFrame.size.height; 
         _statusLabel.frame = labelFrame; 

         CGRect appFrame = _appView.frame; 
         appFrame.size.height += labelFrame.size.height; 
         _appView.frame = appFrame; 
        } 
        completion:completion]; 
} 

- (void)unhideStatusWithCompletion:(void (^)(BOOL finished))completion 
{ 
    [UIView animateWithDuration:0.25 
        animations:^{ 
         CGRect labelFrame = _statusLabel.frame; 
         labelFrame.origin.y -= labelFrame.size.height; 
         _statusLabel.frame = labelFrame; 

         CGRect appFrame = _appView.frame; 
         appFrame.size.height -= labelFrame.size.height; 
         _appView.frame = appFrame; 
        } 
        completion:completion]; 
} 

- (void)setStatus:(NSString *)text 
{ 
    BOOL hasText = (text && [text length] > 0); 

    if (hasText) 
    { 
     if (!_statusHidden) 
     { 
      // if we have text, but status is already shown, then hide it and unhide it with new value 

      [self hideStatusWithCompletion:^(BOOL finished){ 
       _statusLabel.text = text; 
       [self unhideStatusWithCompletion:nil]; 
      }]; 
     } 
     else 
     { 
      // if we have text, but no status is currently shown, then just unhide it 
      _statusLabel.text = text; 
      [self unhideStatusWithCompletion:nil]; 
     } 
     _statusHidden = NO; 
    } 
    else 
    { 
     if (!_statusHidden) 
     { 
      // if we don't have text, but status bar is shown, then just hide it 

      [self hideStatusWithCompletion:^(BOOL finished){ 
       _statusLabel.text = text; 
      }]; 
      _statusHidden = YES; 
     } 
    } 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

@end 

그리고, 상태 메시지가를 사용하는 것이 업데이트 할 원하는 어떤 뷰 컨트롤러 :

// StatusBarViewController.h 
// 
// Created by Robert Ryan on 7/8/12. 

#import <UIKit/UIKit.h> 

@interface StatusBarViewController : UIViewController 

@property (strong, nonatomic) UIViewController *appController; 

- (void)setStatus:(NSString *)text; 

@end 

내 구현 파일 (이 ARC이다)과 같습니다처럼

내 헤더 보인다 같은 종류의 메소드 :

- (void)setStatus:(NSString *)text 
{ 
    UIViewController *controller = [UIApplication sharedApplication].delegate.window.rootViewController; 

    if ([controller isKindOfClass:[StatusBarViewController class]]) 
    { 
     [(StatusBarViewController *)controller setStatus:text]; 
    } 
} 
관련 문제