【问题标题】:Incorrect size of label on viewWillAppearviewWillAppear 上的标签大小不正确
【发布时间】:2013-08-05 23:11:38
【问题描述】:

我有以下设置

  • 只有横向视图的 XIB 文件。此视图连接到我的控制器
  • 此视图上有一个连接到IBOutlet UILabel* label 的标签
  • 这个标签是这样配置的(它占据了整个屏幕的宽度)。
  • 我重写了 viewWillAppear 并执行此操作(以获取标签的大小)。
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGRect rect = _labelTitleLand.frame;
}

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

它在横向启动时返回 size = (width 741 height 21)。这很奇怪。我预计它将返回宽度 1024,高度 21 用于横向。

我的印象是,在 viewWillAppear 出现时,所有控件的大小都已计算完毕。

更新 1

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

【问题讨论】:

  • 试试 _labelTitleLand.bounds 看看是否可行。
  • @rdelmar:返回相同的结果

标签: ios ios6 xib


【解决方案1】:

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

所以你应该检查viewDidLayoutSubviews 中的框架,它仍然是在实际绘制视图层次结构之前。如果您需要在此处进行更改,您可以在不引起任何重绘的情况下进行。

viewWillAppear 为时过早,因为这是在您的自动调整大小蒙版(和/或自动布局约束)生效之前。

【讨论】:

  • 谢谢。很好的答案。顺便提一句。有没有很好的指南来描述这一点?
【解决方案2】:

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

我用

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

在viewWillAppear中,然后:

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

这让您的应用有时间设置自己的框架。 它不是那么优雅,看起来像是一种解决方法,但它非常有效。

您也可以尝试像这样在 viewWillAppear 中强制作为 UILabel 容器的 UIView 的框架:

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

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

    CGRect rect = _labelTitleLand.frame;
}

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

【讨论】:

  • 您引入的 100 毫秒延迟在大多数情况下可能足以完成布局。但与其猜测,您可以使用 viewDidLayoutSubviews 方法,该方法恰好在布局完成时调用,并且在视图出现在屏幕上之前。
  • 是的,当然,如果 OP 还需要支持 iOS4,那不是一个选择。
  • 坦率地说,这两种方法看起来都很老套。我宁愿选择 viewDidLayoutSubviews
  • 我认为@Firoze Lafeer 的回答也更好。但这些方法可能有助于针对 iOS 4。
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2014-01-11
  • 2013-12-04
  • 2013-12-01
相关资源
最近更新 更多