viewWillAppear上标签的大小不正确

时间:2013-08-05 23:11:38

标签: ios ios6 xib

我有以下设置

  • 仅具有横向视图的XIB文件。此视图是与我的控制器的连接
  • 此视图上有一个与IBOutlet UILabel* label
  • 相关联的标签
  • 此标签配置如下(它占据整个屏幕宽度)。 enter image description here
  • 我覆盖了viewWillAppear并执行此操作(以获取标签的大小)。
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGRect rect = _labelTitleLand.frame;
}

奇怪的事情(我不明白)。当它以纵向(在iPad上)启动时返回size =(宽度768,高度21),这是正确的。

当它在风景中启动时,它返回size =(宽度741高度21)。这很奇怪。我预计它将返回宽度1024,高度为21的景观。

我的印象是,在viewWillAppear,我们已经计算了所有控件尺寸。

更新1

如果我在viewDidAppear上检查labelTitleLand.frame,那么它会返回正确的结果。但是,我不喜欢这个,因为我想做一些影响视图绘制的动作(基于这个大小)。在这种情况下,如果我将在viewDidAppear上执行此操作,据我所知,将会有可见的重绘。

2 个答案:

答案 0 :(得分:8)

在获得实际的最终帧之前,必须完成视图层次结构的布局。

因此,您应该检查viewDidLayoutSubviews中的框架,该框架仍将在实际绘制视图层次结构之前。如果您需要在此处进行更改,则可以不进行任何重绘。

viewWillAppear为时尚早,因为这是在您的自动调整遮罩(和/或自动布局限制)产生影响之前。

答案 1 :(得分:0)

这似乎是一个与在运行时实际调用方法有关的问题。

我使用

解决了类似的情况
[self performSelector:@selector(checkMethod) withObject:nil afterDelay:0.1];

在viewWillAppear中,然后:

- (void)checkMethod
{
    rect = _labelTitleLand.frame;
}

这为您的应用程序提供了设置自己的框架所需的时间。 它不是那么优雅,它看起来像一个解决方法,但它非常有效。

您还可以尝试在viewWillAppear中强制UIView的框架作为UILabel的容器,如下所示:

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

    self.view.frame = CGRectMake(0.0f, 0.0f, 1024.0f, 768.0f);

    CGRect rect = _labelTitleLand.frame;
}

但第一种解决方案更可靠,通常不会出现延迟。