2013-10-27 68 views
0

我有一個側邊欄,我用這個來實現: http://mobile.tutsplus.com/tutorials/iphone/implementing-container-containment-sliding-menu-controller/添加空間的上方側邊欄

然而,我注意到,沒有第一個菜單項,你可以在這裏看到上面有足夠的空間:enter image description here

這裏是我的rootcontroller.m

#define kExposedWidth 200.0 
#define kMenuCellID @"MenuCell" 

#import "RootController.h" 

@interface RootController() 

@property (nonatomic, strong) UITableView *menu; 
@property (nonatomic, strong) NSArray *viewControllers; 
@property (nonatomic, strong) NSArray *menuTitles; 

@property (nonatomic, assign) NSInteger indexOfVisibleController; 

@property (nonatomic, assign) BOOL isMenuVisible; 

@end 


@implementation RootController 

- (id)initWithViewControllers:(NSArray *)viewControllers andMenuTitles:(NSArray *)menuTitles 
{ 
    if (self = [super init]) 
    { 
     NSAssert(self.viewControllers.count == self.menuTitles.count, @"There must be one and only one menu title corresponding to every view controller!"); // (1) 
     NSMutableArray *tempVCs = [NSMutableArray arrayWithCapacity:viewControllers.count]; 

     self.menuTitles = [menuTitles copy]; 

     for (UIViewController *vc in viewControllers) // (2) 
     { 
      if (![vc isMemberOfClass:[UINavigationController class]]) 
      { 
       [tempVCs addObject:[[UINavigationController alloc] initWithRootViewController:vc]]; 
      } 
      else 
       [tempVCs addObject:vc]; 

      UIBarButtonItem *revealMenuBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Menu" style:UIBarButtonItemStylePlain target:self action:@selector(toggleMenuVisibility:)]; // (3) 

      UIViewController *topVC = ((UINavigationController *)tempVCs.lastObject).topViewController; 
      topVC.navigationItem.leftBarButtonItems = [@[revealMenuBarButtonItem] arrayByAddingObjectsFromArray:topVC.navigationItem.leftBarButtonItems]; 


     } 
     self.viewControllers = [tempVCs copy]; 
     self.menu = [[UITableView alloc] init]; // (4) 
     self.menu.delegate = self; 
     self.menu.dataSource = self; 

    } 
    return self; 
} 



- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.menu registerClass:[UITableViewCell class] forCellReuseIdentifier:kMenuCellID]; 
    self.menu.frame = self.view.bounds; 
    [self.view addSubview:self.menu]; 

    self.indexOfVisibleController = 0; 
    UIViewController *visibleViewController = self.viewControllers[0]; 
    visibleViewController.view.frame = [self offScreenFrame]; 
    [self addChildViewController:visibleViewController]; // (5) 
    [self.view addSubview:visibleViewController.view]; // (6) 
    self.isMenuVisible = YES; 
    [self adjustContentFrameAccordingToMenuVisibility]; // (7) 


    [self.viewControllers[0] didMoveToParentViewController:self]; // (8) 

} 

- (void)toggleMenuVisibility:(id)sender // (9) 
{ 
    self.isMenuVisible = !self.isMenuVisible; 
    [self adjustContentFrameAccordingToMenuVisibility]; 
} 


- (void)adjustContentFrameAccordingToMenuVisibility // (10) 
{ 
    UIViewController *visibleViewController = self.viewControllers[self.indexOfVisibleController]; 
    CGSize size = visibleViewController.view.frame.size; 

    if (self.isMenuVisible) 
    { 
     [UIView animateWithDuration:0.5 animations:^{ 
      visibleViewController.view.frame = CGRectMake(kExposedWidth, 0, size.width, size.height); 
     }]; 
    } 
    else 
     [UIView animateWithDuration:0.5 animations:^{ 
      visibleViewController.view.frame = CGRectMake(0, 0, size.width, size.height); 
     }]; 

} 

- (void)replaceVisibleViewControllerWithViewControllerAtIndex:(NSInteger)index // (11) 
{ 
    if (index == self.indexOfVisibleController) return; 
    UIViewController *incomingViewController = self.viewControllers[index]; 
    incomingViewController.view.frame = [self offScreenFrame]; 
    UIViewController *outgoingViewController = self.viewControllers[self.indexOfVisibleController]; 
    CGRect visibleFrame = self.view.bounds; 


    [outgoingViewController willMoveToParentViewController:nil]; // (12) 

    [self addChildViewController:incomingViewController]; // (13) 
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; // (14) 
    [self transitionFromViewController:outgoingViewController // (15) 
         toViewController:incomingViewController 
           duration:0.5 options:0 
          animations:^{ 
           outgoingViewController.view.frame = [self offScreenFrame]; 

          } 

          completion:^(BOOL finished) { 
           [UIView animateWithDuration:0.5 
               animations:^{ 
                [outgoingViewController.view removeFromSuperview]; 
                [self.view addSubview:incomingViewController.view]; 
                incomingViewController.view.frame = visibleFrame; 
                [[UIApplication sharedApplication] endIgnoringInteractionEvents]; // (16) 
           }]; 
           [incomingViewController didMoveToParentViewController:self]; // (17) 
           [outgoingViewController removeFromParentViewController]; // (18) 
           self.isMenuVisible = NO; 
           self.indexOfVisibleController = index; 
    }]; 
} 


// (19): 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.menuTitles.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kMenuCellID]; 
    cell.textLabel.text = self.menuTitles[indexPath.row]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self replaceVisibleViewControllerWithViewControllerAtIndex:indexPath.row]; 
} 

- (CGRect)offScreenFrame 
{ 
    return CGRectMake(self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
} 

@end 
+0

你是指「載體」和「祕籍」之間的空格嗎? – nhgrif

+0

是的,先生。我只需要添加一些空白區域。 – user2913669

回答

0

給予高度的代碼到你的節頭會加重上述第一排空間..

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    return 40; //set this value 
} 
+0

添加到您的RootController。 –

0

你真正的問題在於處理應用頂部的狀態欄。

當你的應用程序正在使用時,你想讓狀態欄懸空嗎?那麼你可能會考慮將整個界面壓低20pts(除非你真的希望狀態欄重疊你的內容)

或者你可以隱藏你的整個應用程序中的statusBar,或者特別是viewControllers。