4

Я добавил несколько компонентов в NavigationBar в приложении, которое я создаю. Высота панели изменяется динамически, как в Safari для iPhone, когда вы нажимаете на поле URL. У меня есть все взаимодействия и изменения, которые работают отлично, за исключением случаев, когда я перехожу на другую вкладку и возвращаюсь.Настраиваемая навигационная панель не отображается правильно после возврата на вкладку

Если я запустил приложение, нажмите вторую вкладку, на которой отображается навигационная панель.

navbar OK

Если я после этого сразу нажать на первую вкладку, а затем обратно на второй вкладке снова, Панель навигации обрезается.

navbar clipped

Я настраивая Navbar в моем методе viewWillAppear

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    if (navBar == nil) { 

     CGFloat width = self.view.frame.size.width; 


     navBar = [self.navigationController.navigationBar autorelease]; 
     navBar.frame = CGRectMake(0,20,width,52); 
     //This doesn't appear to have any effect- was set to   
     //UIViewAutoresizingFlexibleWidth and worked but with with the same issue. 
     navBar.autoresizingMask = UIViewAutoresizingFlexibleHeight; 

     self.navigationItem.title = nil; 


     label = [[UILabel alloc] initWithFrame: 
      CGRectMake(10,2,width-20,14)];  
     label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     label.text = @"My Custom NavBar"; 
     label.backgroundColor = [UIColor clearColor]; 
     label.font = [UIFont systemFontOfSize:12]; 
     label.textAlignment = UITextAlignmentCenter; 
     [navBar addSubview:label]; 

     urlTextField = [[UITextField alloc] initWithFrame: 
        CGRectMake(10,19,width-75,26)]; 
     urlTextField.clearButtonMode = UITextFieldViewModeWhileEditing; 
     [urlTextField addTarget:(id)self action:@selector(textFieldDidChange:) 
             forControlEvents:UIControlEventEditingChanged]; 


     bookmarkButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     bookmarkButton.frame = CGRectMake(0,0,21,21); 
     [bookmarkButton setImage:[UIImage imageNamed:@"bookmark.png"] forState:UIControlStateNormal]; 
     [bookmarkButton addTarget:self action:@selector(bookmarkPressed:) forControlEvents:UIControlEventTouchUpInside]; 
     urlTextField.leftView = bookmarkButton; 
     urlTextField.leftViewMode = UITextFieldViewModeAlways; 


     actionButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     actionButton.frame = CGRectMake(0,0,21,21); 
     [actionButton setImage:[UIImage imageNamed:@"refresh.png"] forState:UIControlStateNormal]; 
     [actionButton addTarget:self action:@selector(actionPressed:) forControlEvents:UIControlEventTouchUpInside]; 
     urlTextField.rightView = actionButton; 
     urlTextField.rightViewMode = UITextFieldViewModeAlways; 


     urlTextField.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     urlTextField.borderStyle = UITextBorderStyleRoundedRect; 
     urlTextField.font = [UIFont systemFontOfSize:17]; 
     urlTextField.delegate = self; 
     [navBar addSubview:urlTextField]; 


    } else { 

     //XXX This does make the navBar display correctly 
     //but I don't really want the keyboard visible when returning from another tab 
     //[urlTextField becomeFirstResponder]; 

    } 

} 

Обратите внимание на последний комментарий в коде выше и по Если я заставить клавиатуру для отображения, или если пользователь щелкает в UITextField, NavBar отображается правильно.

Я пробовал много вещей, проверяя размеры кадров вида (вид 2 на изображениях), NavBar, но не повезло. Кто-нибудь знает, в чем проблема? Я с удовольствием расскажу подробнее.

Спасибо.

+0

Я нашел способ, чтобы сделать эту работу, но я не знаю, почему, так если кто-нибудь знает, почему выше не работает, или почему мое решение действительно работает, сообщите мне. Я объявил класс делегата приложения как реализацию протокола UITabBarControllerDelegate и зарегистрировал его как делегат TabBarControllers. Затем я добавить следующее к методу didSelectViewController: \t , если (tabBarController.tabBar.selectedItem.tag == 2) { ((UINavigationController *) ViewController) .navigationBar.frame = CGRectMake (0,20,320,52) ; } Конечно, я пошел в IB и дал каждому TabBarItem уникальное значение тега. –

ответ

1

В основном вы идете по этому поводу не так. Вам никогда не придется обращаться к кадру навигационной панели (не говоря уже о ее изменении), и вы, конечно же, никогда не будете добавлять к нему подвид. Из документов:

В отличие от других типов представлений, вы не добавить подвидов на панели навигации непосредственно. Вместо этого вы используете пункт навигации (экземпляр класса UINavigationItem), чтобы указать какие кнопки или пользовательские виды вы хотите отобразить .

Таким образом, в - (ID) initWithNibName: расслоение: метод контроллера зрения вы хотите:

// Setting this will automatically grow the height of the navigation bar 
// to the appropriate height 
self.navigationItem.prompt = @"My Custom NavBar"; 

// Construct urlTextField here ... 
self.navigationItem.titleView = urlTextField; 

// This is the button with the gears icon 
UIBarButtomItem *rightButtonItem = [[UIBarButtomItem alloc] initWithCustomView:view]; 
self.navigationItem.rightBarButtonItem = rightButtomItem; 
[rightButtomItem release]; 
+0

И хотя я изначально отметил это как мой принятый ответ, после изменения кода, чтобы я больше не изменял рамку навигационной панели, добавьте UIViews непосредственно в навигационную панель (только работая с элементами навигации, проблема все еще происходит). –

+0

Черт, ну вы может попробовать вызвать setNeedsLayout в представлении viewWillAppear :, но я действительно просто догадываюсь. – jamesmoschou

+0

Не требовалось вызывать setNeedsLayout.Я оставил свои исправления в том, что я отметил выше. –

Смежные вопросы