无法viewDidAppear之前正确设置帧(Unable to set frame correct

2019-06-18 16:07发布

我不知道是否有人知道为什么当你在设定一个子视图的框架viewDidLoadviewWillAppear的更改不会在屏幕上的影响,但如果你将其设置viewDidAppear怎么办呢?

在我来说,我加载两个tableviews然后试图将它们下移在自定义厦门国际银行viewDidLoad ,以允许其在添加另一种观点认为空间viewDidLoad ,因为它并不总是必要的,以显示它。

问题是,当i的设定帧viewDidLoadviewWillAppear它被设置在对象上,我可以通过打印出来看到,但它不被反射在屏幕上。 移动我的设定框架调用viewDidAppear会导致一切正常工作。

这是错误的认为我应该可以设置在框架viewDidLoad

- (id)init {
    if ( self = [super initWithNibName:@"MyView" bundle:nil] ) {}

    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.descriptionWebView = [[[UIWebView alloc] initWithFrame:CGRectMake( 0, 0, self.view.frame.size.width, 200 )] autorelease];

    [self.view addSubview:self.descriptionWebView];

    self.tableView1.autoresizingMask = UIViewAutoresizingNone;
    self.tableView2.autoresizingMask = UIViewAutoresizingNone;

    [self.descriptionWebView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"...." withExtension:@"html"]]];

    table1LocationWithHeader = CGRectMake( self.tableView1.frame.origin.x, 200, self.tableView1.frame.size.width, self.tableView1.frame.size.height - 200 );
    table2LocationWithHeader = CGRectMake( self.tableView2.frame.origin.x, 200, self.tableView2.frame.size.width, self.tableView2.frame.size.height - 200 );

    //this will NOT work
    self.tableView1.frame = table1LocationWithHeader;
    self.tableView2.frame = table2LocationWithHeader;
}

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

    //this will NOT work
    self.tableView1.frame = table1LocationWithHeader;
    self.tableView2.frame = table2LocationWithHeader;
}


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

    //this WILL work
    self.tableView1.frame = table1LocationWithHeader;
    self.tableView2.frame = table2LocationWithHeader;
}


//I added these after comments for stack overflow users, it seems like viewDidLayoutSubviews is the best place to set the frame

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    //this will NOT work
    self.tableView1.frame = table1LocationWithHeader;
    self.tableView2.frame = table2LocationWithHeader;
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    //this WILL work
    self.tableView1.frame = table1LocationWithHeader;
    self.tableView2.frame = table2LocationWithHeader;
}

Answer 1:

当加载的类然而没有UI元素已经被初始化,并且因此任何试图引用它们将被覆盖或在初始化过程,发生在viewDidLoad中和viewDidAppear之间的调用unavaliable viewDidLoad中被调用。 一旦所有UI元素已经initalised并绘制viewDidAppear被调用。

viewDidLoad中 - 控制器的视图后调用被加载到存储器

在这一点上的看法是不是视图体系内的。

viewWillAppear中 - 通知视图控制器,其观点是要被添加到视图层次结构。

再次,该视图还没有被添加到视图层次结构。

viewDidAppear - 通知其视图添加到视图层次视图控制器。

只有这样,是添加到视图层次结构的视图。

更新

viewDidLayoutSubviews是最合适的地方来修改UI实际上出现在屏幕上了。

viewDidLayoutSubviews - 通知其观点,只是奠定了其子视图的视图控制器。



Answer 2:

看到这个线程当layoutSubviews叫什么名字?
当使用自动布局,框架并不自动调用layoutSubviews。 这是非常重要的。 从REF:

  • init不会引起layoutSubviews被称为(杜)
  • addSubview:使layoutSubviews被称为在视图上被添加,它被加入到(目标视图)的图,和目标的所有子视图。 ...


如果您在viewDidLoad中添加子视图,layoutSubviews viewDidAppear之前叫,你可以得到子视图的正确尺寸。 但是,如果你什么都不做,layoutSubviews将viewDidAppear后调用。 这是给你的代码。



Answer 3:

在viewWillAppear中()

只需调用layoutIfNeeded()一次,你想获得它的框架图。

如果的tableView然后tableView.layoutIfNeeded()为exmple



文章来源: Unable to set frame correctly before viewDidAppear