UITableViewController изменяет фрейм UITableView, когда приложение возвращается на передний план и становится активным

У меня есть UITableViewController, который встроен в UITabBarController а также управляется UINavigationController,

Единственное место, где мне удалось настроить UITableViewController's рамка просмотра таблицы находится в viewDidAppear:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:YES];

    [self customizeTableViewAppearance];
}

Здесь customizeTableViewAppearance метод:

- (void)customizeTableViewAppearance
{
    self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

    if([UIScreen mainScreen].bounds.size.height == 568) {

        [self.tableView setFrame:CGRectMake(0, 60, 320, 460)];

    } else {

        [self.tableView setFrame:CGRectMake(0, 60, 320, 370)];

    }
}

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

Конечно же, если я перейду на другую вкладку, а затем снова вернусь на вкладку, методы представления вызываются и UITableView's кадр снова правильный.

Как я могу сделать так, чтобы, если пользователь покидает приложение, а затем позже возобновляет его, мой кадр останется установленным и не будет сброшен UITableViewController?

3 ответа

Решение

Не совсем понятно, почему вы манипулируете UITableViewController"s tableView, но в большинстве случаев вы не должны.

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

Вместо изменения tableViewв кадре, вы должны попробовать одну из следующих вещей:

  • Попробуйте установить self.edgesForExtendedLayout = UIRectEdgeNone при инициализации вашего UITableViewController

или же:

  • Удостовериться self.automaticallyAdjustsScrollViewInsets = YES при инициализации вашего UITableViewController

или, если по какой-то причине вам нужно управлять tableView"s contentInset вручную:

  • Удостовериться self.automaticallyAdjustsScrollViewInsets = NO при инициализации вашего UITableViewController, Сейчас реализуем viewDidLayoutSubviews следующее

    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
        self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0);
    }
    

Изменить: Я только что видел, что вы используете раскадровку. Вы можете либо установить edgeForExtendedLayout, либо автоматически AdjustsScrollViewInsets из раскадровки, либо установить их, реализовав -(void)awakeFromNib; метод.

Не зная, почему вы делаете то, что делаете, простое решение для этого случая будет следующим: добавьте это в метод init вашего tableView:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customizeTableViewAppearance) name:UIApplicationDidBecomeActiveNotification object:nil];

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

Способ исправить это - переопределить viewDidLayoutSubviews метод и место мой customizeTableViewAppearance метод внутри него:

- (void)viewDidLayoutSubviews
{
    [self customizeTableViewAppearance];
}

UITableView всегда имеет правильный кадр сейчас.

Другие вопросы по тегам