UITableView: рисование-поведение представления верхнего и нижнего колонтитулов

#ios #uitableview

#iOS #uitableview

Вопрос:

Почему верхний и нижний колонтитулы tableview всегда остаются на вершине иерархии представлений, но не ячейки таблицы?

Вот что я получил:

  • Представление таблицы с пользовательскими ячейками, нижним колонтитулом и заголовком
  • Панель навигации с кнопкой меню справа
  • Когда пользователь нажимает кнопку меню, полупрозрачное меню (UIView) исчезает сверху, но не над панелью навигации, а только над представлением моего tableviewcontroller
  • Когда пользователь нажимает кнопку меню, меню возвращается к (0, -menuHeight)
  • Но когда меню находится над заголовком, эта область меню находится за моим заголовком

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

У кого-нибудь есть идея, как решить эту проблему? Почему ячейки нарисованы правильно?

Ответ №1:

Вероятно, вам не следует напрямую вмешиваться во внутреннюю иерархию представлений UITableView . Apple может свободно упорядочивать подвиды табличного представления по своему усмотрению (и изменять его в будущих выпусках).

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

Комментарии:

1. Хорошо — я изменил свой дизайн — но теперь я не получаю события касания в своей таблице. -> пожалуйста, смотрите мой новый ответ ниже

2. Вы не должны добавлять ответ, содержащий вопрос. Вместо этого отредактируйте свой первоначальный вопрос. Я также не считаю хорошей идеей сбрасывать self.TableView в другое представление. AFAIK, свойство TableView UITableViewController просто возвращает свой выход для просмотра по умолчанию. Другими словами, больше не используйте UITableViewController. Вместо этого используйте обычный UIViewController.

3. Хорошо — вы имеете в виду, что я должен создать новый ViewController и добавить в него представление tableviewcontrollers?

Ответ №2:

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

Но когда я добавляю этот метод — я вижу, что я касаюсь tableviewcontroller…

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"ShieldingViewController received touch");
    [self.buttonMenu shieldingViewTouched];
}
  

Вот что я изменил:

 - (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y = 0;

    UIView *rootView = [[UIView alloc] initWithFrame:viewFrame];
    rootView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;


    // Setup the table view
    UITableView *newTableView = [[UITableView alloc] initWithFrame:viewFrame style:self.tableView.style];
    newTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    newTableView.backgroundColor = [UIColor darkGrayColor];


    UIView *menuLayerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)];


    self.tableView = newTableView;

    [rootView addSubview:self.tableView];
    [rootView addSubview: menuLayerView];
    self.view = rootView;

    [[CustomNavigationController instance] setCurrentViewForMenu: menuLayerView];
    [[CustomNavigationController instance] showMenuInNavigationBarForController:self];

    [newTableView release];
    [menuLayerView release];
    [rootView release];
}