【问题标题】:Cannot prevent UITableView from moving when bounds change边界更改时无法阻止 UITableView 移动
【发布时间】:2014-05-25 12:14:02
【问题描述】:

我有一个使用此方法创建的UITableView(在UIViewController 内):

- (void) viewDidLayoutSubviews {
if (!self.tableView) {
    self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 120, self.view.bounds.size.width, self.view.bounds.size.height-120) style:UITableViewStylePlain];
    self.tableView.superview.autoresizingMask= NO;
//        [self.tableView setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.backgroundColor = [UIColor blueColor];
    self.edgesForExtendedLayout = UIRectEdgeNone;
    [self.tableView setShowsHorizontalScrollIndicator:NO];
    [self.tableView setShowsVerticalScrollIndicator:NO];
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [self.view addSubview:self.tableView];
}

}

当应用程序进入后台并重新加载视图控制器时,tableView 会由于边界的变化而降低(我认为)。但是,我尝试在情节提要中关闭自动布局,将self.viewself.tableViewautoresizesSubviews "BOOL" 设置为,甚至尝试更改tableView 上的约束。每次视图加载时,内容都会移动。此外,我已将启动放入viewDidLoad,但实际尺寸并未映射到屏幕上。在viewDidLayoutSubviews 中启动后如何强制tableView 保持固定?

【问题讨论】:

  • 提示:您不应该在viewDidLayoutSubviews 中初始化您的视图。在viewDidLoad中初始化你的tableView,然后在viewDidLayoutSubviews中设置frame
  • 所以当边界改变时框架会更新?还是会因为被移动而受苦?
  • 没错,viewDidLayoutSubviews 每次边界变化时都会被调用,因此在该方法中设置框架将确保您的 tableView 始终根据当前边界调整大小。
  • @michaels。谢谢你,你要不要做一个象征性的回答,我会把它标记为正确的?

标签: ios objective-c uitableview frame bounds


【解决方案1】:

viewDidLoad 在视图控制器生命周期中仅被调用一次,并且在视图设置其 bounds 属性之前被调用。这是初始化子视图的理想场所。

-(void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 120, self.view.bounds.size.width, self.view.bounds.size.height-120) style:UITableViewStylePlain];
    self.tableView.superview.autoresizingMask= NO;
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.backgroundColor = [UIColor blueColor];
    self.edgesForExtendedLayout = UIRectEdgeNone;
    [self.tableView setShowsHorizontalScrollIndicator:NO];
    [self.tableView setShowsVerticalScrollIndicator:NO];
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [self.view addSubview:self.tableView];
}

viewDidLayoutSubviews 每次边界改变时都会被调用,因此在该方法中设置框架将确保您的 tableView 始终根据当前边界调整大小:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.tableView.frame = CGRectMake(0, 120, self.view.bounds.size.width, self.view.bounds.size.height-120);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多