UITableView navigationController Раздел индекса выравнивать после заголовка навигации - PullRequest
0 голосов
/ 17 августа 2010

В разделе Indexed UITableView, как сделать так, чтобы заголовок выбранного раздела (путем нажатия на указатель раздела) выровнялся _not_ в самой верхней части экрана ( при в навигацииконтроллер) а точнее флеш после заголовка панели навигации вверху?

вот так:[кнопка] Заголовок панели навигации в верхней части экрана [другая кнопка]X (буква раздела)элементы в разделе ....

Для ясности, проблема, с которой я сталкиваюсь, заключается в том, что при нажатии на индекс раздела справа таблица прокручивает этот раздел до самого верха экран , скрытый под панелью навигации.Я хочу, чтобы этот заголовок раздела точно после заголовка навигации касался панели навигации низ границы с верх строки «Письмо раздела» - какэто, например, когда таблица впервые появляется.

1 Ответ

1 голос
/ 18 августа 2010

Лучшее решение:

а) Поспи немного.

b) Поймите, что, пока вы спали, использование 'UIBarStyleBlackTranslucent' было устаревшим , поэтому просто сделайте это вместо:

  • Откройте MainWindow.xib в Интерфейсном Разработчике, выберите элемент «UINavigationBar» внутри «Navigation Controller» внутри вашего «Контроллера панели вкладок» и измените «Стиль» на «Черный непрозрачный» вместо полупрозрачного .
  • В своем файле класса UITableViewController напишите

    - (void)viewWillDisappear:(BOOL)animated {
    self.navigationController.navigationBar.translucent = YES; /* Yes, go underneath the Navigation Bar elsewhere if you want to. */
    [super viewWillDisappear:animated];
    }
    - (void)viewWillAppear:(BOOL)animated {
    self.navigationController.navigationBar.translucent = NO; /* No going underneath the Navigation Bar. Problem solved! */
    ...
        [super viewWillAppear:animated];
    }
    

в) Перестаньте чувствовать смущение и вместо этого поймите, что сон теперь является еще одной полезной техникой кодирования в вашем арсенале. ;п


Ключи к правильному решению:

"Контроллер навигации никогда не отображает содержимое под непрозрачной панелью навигации."

"Установите для полупрозрачного свойства вашего контроллера навигации значение YES. Это позволит вашему контенту перекрывать панель навигации."

см. Developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/NavigationControllers/NavigationControllers.html

см. Developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationBar_Class/Reference/UINavigationBar.html#//apple_ref/occ/instp/UINavigationBar/translucent

UIBarStyle Определяет стилистическое оформление различных типов представлений ...

UIBarStyleBlackTranslucent = 2, // устарел

Используйте UIBarStyleBlack и установите для свойства полупрозрачности значение YES.

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIKitDataTypesReference/Reference/reference.html


ДО СОН, исправил это "Трудный путь" ...
- (void)correctFrame:(UIView *)viewWithWrongFrame {
    CGRect correctedFrame = [[viewWithWrongFrame superview] frame];
    correctedFrame.size.height = correctedFrame.size.height - self.navigationController.navigationBar.frame.size.height; /* Height without Navigation Bar */
    correctedFrame.origin.y = correctedFrame.origin.y + self.navigationController.navigationBar.frame.size.height; /* Origin below Navigation Bar */
    [viewWithWrongFrame setFrame:correctedFrame];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    [self correctFrame:[self.navigationController.view.subviews objectAtIndex:0]]; /* Correct the frame so it is after the Navigation Bar */
    [self.tableView setContentInset:UIEdgeInsetsMake(-self.navigationController.navigationBar.frame.size.height, 0, 0, 0)]; /* Eliminate initial blank space at top.*/
    ...
}

- (void)cleanDisplay {
    [self.tableView setContentInset:UIEdgeInsetsZero]; /* Fix difference between horizontal and vertical orientation. */
    ...
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    [self correctFrame:[self.navigationController.view.subviews objectAtIndex:0]]; /* Correct the frame so it is after the Navigation Bar */

    /* Clean the display after turning... */
    [self performSelectorOnMainThread:@selector(cleanDisplay) withObject:nil waitUntilDone:NO];
}
- (void)viewWillAppear:(BOOL)animated {
    ...
    [self performSelectorOnMainThread:@selector(cleanDisplay) withObject:nil waitUntilDone:NO];
    ...
}

Обратите внимание, что не удалось подходы включены:

Использование Interface Builder для встраивания UITableView в UIView. Не сработало, потому что все было автоматически измерено до полной высоты. Изменение размера [self.tableView superview] .frame = CGRectInset ([self.tableView superview] .frame, 44, 44); или границы не имели никакого эффекта, ни self.tableView.frame, ни .bounds.

Ключ к тому, что было не так, появился, когда я попытался: self.navigationController.view.frame = CGRectInset (self.navigationController.view.frame, 20, 44); который фактически изменил размер представления с таблицей в нем. Очевидно, что изменение подпредставления на это решит исходную проблему.

Исправлено с подходом, описанным выше. Хотя перед перемещением назад или вперед к другим экранам изменения должны быть возвращены в нормальное состояние, чтобы избежать смещения элементов в другом месте.

...