UINavigationBar подпрыгивает, когда приложение становится активным - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть пользовательский UINavigationBar, у которого фон изображения и высота отличаются от значения по умолчанию. Он отображается нормально, но как только я перехожу назад и вперед между приложениями, фоновое изображение и кнопки на панели навигации подпрыгивают вверх.

UINavigationBar создается в наконечнике и имеет собственный класс, который переопределяет реализацию по умолчанию для добавления изображения:

@implementation MyUINavigationBar


- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"nav.png"];
    rect.size.height = 60;
    [image drawInRect:rect];
}


@end

В этот момент панель отображается неправильно. В - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions моего делегата приложения я исправляю это с помощью кода:

self.navigationController.view.frame = CGRectMake(0, 20, 320, 460);
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 60);

Теперь все отображается правильно. Когда я переключаюсь на другое приложение и возвращаюсь назад, полоса подпрыгивает, как будто кадры не были применены. Это происходит сразу после того, как я снова переключаюсь на приложение.

Ниже приведены два скриншота, показывающие, что происходит. Первая показывает правильную версию, другая - неисправную.

Есть идеи, что может происходить? Я попытался применить новые кадры в viewWillAppear и viewDidAppear активного представления или в applicationDidBecomeActive делегата приложения, но это не помогло.

https://skitch.com/instromaniac/rtagr/ios-simulator https://skitch.com/instromaniac/rtaf9/view-not-ok

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Я потратил несколько дней, чтобы понять это, вот трюк, который действительно работает для полной, настраиваемой кнопки.

backBarButtonItem полностью заблокирован в iOS SDK (4.3, насколько я знаю), поэтому мы должны использовать leftBarButtonItem, который выполняет эту работу вместо обычной кнопки возврата.

Принимая во внимание, что backBarButtonItem должен быть определен в контроллере Root View вашего UINavigationController, мы должнынастройте нашу поддельную кнопку BackButton в дочернем представлении (например, nextViewController в моем примере).

Этот код находится в моем контроллере корневого представления (который является UITableViewDelegate) в -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

[[self navigationController] pushViewController:nextViewController animated:YES];

здесь показано отображение нашей фальшивой кнопки возврата в пользовательской панели UINavigationBar размером 70px (играйте с кадрами в соответствии с вашими потребностями):

-(void)handleBack:(id)sender {
    // Simulate the original back button
    [self.navigationController popViewControllerAnimated:YES];    
}

-(void)viewWillAppear:(BOOL)animated {

    // Making a custom button
    UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];    
    [backBtn setImage:[UIImage imageNamed:@"back-button.png"] forState:UIControlStateNormal];    
    [backBtn setImage:[UIImage imageNamed:@"back-button-hover.png"] forState:UIControlStateHighlighted];    
    [backBtn setImage:[UIImage imageNamed:@"back-button-disabled.png"] forState:UIControlStateDisabled];    
    [backBtn setFrame:CGRectMake(6, 4, 60, 30)];

    // Binding custom target & action to the button
    [backBtn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];

    // Nesting the button in a UIView to position the button anywhere!
    UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 70)];
    [backView addSubview:backBtn];

    // Nesting all of these into a UIBarButtonItem
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:backView];

    // Overwrite original backbutton (self.navigationItem.backBarButtonItem DO NOT WORK HERE 
    self.navigationItem.leftBarButtonItem = backItem;

    // Memory clean up
    [backItem release];
    [backView release];        

}

Веселитесь;)

0 голосов
/ 25 февраля 2011

Попробуйте изменить кадр представления контроллера навигации как

self.navigationController.view.frame = CGRectMake (0,0,33,480);

Надеюсь, это поможет

...