我有一个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
重置?
答案 0 :(得分:1)
在不知道为什么你正在做你正在做的事情的情况下,处理这种情况的简单解决方案如下 - 在tableView的init方法中添加:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customizeTableViewAppearance) name:UIApplicationDidBecomeActiveNotification object:nil];
这样,只要你的应用程序再次变为活动状态,tableView就会调用该方法。
答案 1 :(得分:1)
为什么你操纵UITableViewController
tableView
的框架并不是很清楚,但在大多数情况下,你不应该这样做。
根据您粘贴的内容,似乎是在尝试阻止tableView
或其内容显示在导航栏和标签栏下方。
您应该尝试以下方法之一,而不是更改tableView
的框架:
self.edgesForExtendedLayout = UIRectEdgeNone
UITableViewController
或:
self.automaticallyAdjustsScrollViewInsets = YES
UITableViewController
或者,如果由于某种原因您需要手动管理tableView
contentInset
:
初始化self.automaticallyAdjustsScrollViewInsets = NO
时请确保UITableViewController
。现在实现viewDidLayoutSubviews
如下
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0);
}
编辑:
我刚看到你正在使用故事板。您可以在故事板中设置edgesForExtendedLayout或者AutomaticAdjustsScrollViewInsets,也可以通过实现-(void)awakeFromNib;
方法来设置它们。
答案 2 :(得分:0)
解决此问题的方法是覆盖viewDidLayoutSubviews
方法并将customizeTableViewAppearance
方法置于其中:
- (void)viewDidLayoutSubviews
{
[self customizeTableViewAppearance];
}
UITableView
现在总是拥有正确的框架。