当应用程序返回到前台并变为活动状态时,UITableViewController会更改UITableView的框架

时间:2014-08-28 22:34:17

标签: ios objective-c uitableview uitabbarcontroller

我有一个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 个答案:

答案 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现在总是拥有正确的框架。