我有以下设置
IBOutlet UILabel* label
-(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上执行此操作,据我所知,将会有可见的重绘。
答案 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;
}
但第一种解决方案更可靠,通常不会出现延迟。