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
всегда имеет правильный кадр сейчас.