Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 视图上将显示不正确的标签大小_Ios_Ios6_Xib - Fatal编程技术网

Ios 视图上将显示不正确的标签大小

Ios 视图上将显示不正确的标签大小,ios,ios6,xib,Ios,Ios6,Xib,我有以下设置 只有横向视图的XIB文件。此视图连接到我的控制器 此视图上有一个标签连接到ibuilabel*label 此标签的配置如下(它占据整个屏幕宽度)。 我覆盖了ViewWillDisplay并执行此操作(以获取标签的大小) 奇怪的事情(我不明白)。当它以纵向方式(在iPad上)启动时,返回size=(宽768,高21),这是正确的 当它在横向发射时,返回size=(宽741高21)。这很奇怪。我预计它将返回宽度1024,高度21的景观 我的印象是,在视图出现时,所有控件的大小都已

我有以下设置

  • 只有横向视图的XIB文件。此视图连接到我的控制器
  • 此视图上有一个标签连接到
    ibuilabel*label
  • 此标签的配置如下(它占据整个屏幕宽度)。
  • 我覆盖了ViewWillDisplay并执行此操作(以获取标签的大小)
奇怪的事情(我不明白)。当它以纵向方式(在iPad上)启动时,返回size=(宽768,高21),这是正确的

当它在横向发射时,返回size=(宽741高21)。这很奇怪。我预计它将返回宽度1024,高度21的景观

我的印象是,在视图出现时,所有控件的大小都已经计算过了

更新1


如果我选中ViewDidDisplay上的labelTitleLand.frame,它将返回正确的结果。但是,我不喜欢这样,因为我想做一些影响视图绘制方式的操作(基于此大小)。在这种情况下,如果我将在ViewDidDisplay上执行此操作,据我所知,将进行可见的重画。

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

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


视图将出现
太早,因为这是在您的自动调整大小掩码(和/或自动布局约束)生效之前出现的。

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

我用计算机解决了类似的问题

[self performSelector:@selector(checkMethod) withObject:nil afterDelay:0.1];
将在视图中显示,然后:

- (void)checkMethod
{
    rect = _labelTitleLand.frame;
}
这为你的应用程序提供了设置自己的框架所需的时间。 它不是那么优雅,看起来像是一种变通方法,但它非常有效

您还可以尝试强制UIView的框架(它是ViewLabel中UILabel的容器)如下所示:

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

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

    CGRect rect = _labelTitleLand.frame;
}

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

试试_labeltiteland.bounds,看看是否有效。@rdelmar:它返回相同的结果。在大多数情况下,您引入的100ms延迟可能足以完成布局。但与其猜测,不如使用
viewdilayoutsubviews
方法,该方法在布局完成时,在视图出现在屏幕上之前调用。是的,当然,如果OP仍然需要支持iOS4,那么这不是一个选项。坦率地说,这两种方法看起来都很粗糙。我宁愿选择ViewDidLayoutSubviews,我认为@Firoze Lafeer的答案也更好。但是这些方法对瞄准iOS 4是有帮助的。谢谢。回答得很好。顺便问一下,有没有一个很好的指南来描述这一点?
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

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

    CGRect rect = _labelTitleLand.frame;
}