Настроенный NavigationBar не отображается правильно после возврата на вкладку - PullRequest
4 голосов
/ 28 февраля 2010

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

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

navbar OK

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

navbar clipped

Я настраиваю навигационную панель в моем методе 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, то там будет отображаться навигационная панель.

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

Спасибо.

1 Ответ

1 голос
/ 28 февраля 2010

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

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

Итак, в - (id) initWithNibName: bundle: метод вашего контроллера представления вы хотите:

// 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...