2012-08-17 67 views
2

我在使用iOS5和Storyboards尝试以编程方式调整在UIViewController内托管的UITableView的高度时出现问题。 VC显示主/细节记录样式,UITableView显示详细记录。根据显示的主记录的类型,屏幕底部可能需要一组按钮。如果按钮不需要,那么我想让UITableView扩展它的高度以利用可用空间。我使用下面的代码:iOS - 以编程方式调整UITableView高度的大小

CGRect tableFrame = [tableListView frame]; 
if (blnApprovalRec == YES) 
    tableFrame.size.height = 127; 
else 
    tableFrame.size.height = 170; 
[tableListView setFrame:tableFrame]; 

该代码被称为每当主记录变化,包括在viewDidLoad当屏幕首次加载。问题是,当VC加载时,UITableView不使用指定的大小绘制 - 它只是使用IB的默认大小绘制。一旦用户更改主记录,以便重新加载表格,则一切正常,尺寸根据需要更改。我试过使用setNeedsDisplaysetNeedsLayoutreloadData强制重绘,但没有一个能够工作。

+0

在哪种方法你打上面的代码? – 2012-08-17 09:37:04

+0

该代码是否放置在像viewDidLoad这样的方法中? – Rick 2012-08-17 09:37:07

回答

11

的问题是,当VC负载,UITableView的不画使用尺寸指定

出现这种情况,表视图加载时,但它的UI是没有得到刷新。请验证您是否已在viewDidLoad或viewWillAppear中强制调用。

希望您的验证码是在单独的方法:

CGRect tableFrame = [tableListView frame]; 
if (blnApprovalRec == YES) 
    tableFrame.size.height = 127; 
else 
    tableFrame.size.height = 170; 
[tableListView setFrame:tableFrame]; 

当视图出现最初,您可能必须从主记录的默认选定值。 您可以在viewWillAppear的调用函数中设置该值/实例。

你可以显示方法名称和代码,你如何强制地在代码片段上面调用?

+0

非常感谢Ankit,我在调用viewDidLoad中的代码,我想这意味着控件尚未完全加载。我将代码移到了viewWillAppear,现在所有的代码都可以工作:-)。 – 2012-08-17 10:06:35

2

这是棘手的,它很难调整这样的动态。

我会尝试“setNeedsLayout”和“setNeedsDisplay”为您的表,并在屏幕上强制重绘。

除此之外,我会故事板的最小尺寸,并使用代码来扩大它。

通常,苹果不喜欢我们这样做,你的按钮应该绘制在另一个视图内的视图顶部,如果可能的话。

对不起,我不能更精确,但我已经解决了所有这些问题,通过乱搞和黑客,放弃调整大小和重新设计。请让我知道你怎么去虽然:)

+0

不确定为什么动态调整视图大小“很棘手”?苹果在哪里说他们不希望开发人员调整视图大小?你为什么要在桌面上绘制按钮? – 2012-08-17 09:45:36

+0

那么,你正在关注文档并使用setFrame不是吗?我的意思是,在文档动态调整大小后,下面的文档还不适合我。在其他视图顶部绘制视图是我在过去将模式按钮嵌入到桌面视图中的方式。但真正的解决方案是使用导航和标签栏控制器以及桌面视图 - 我必须这样做才能避免动态调整大小和移动事物。 – FaddishWorm 2012-08-17 09:50:04

1

请确保您设置表后加载框架。

你在哪个方法中调用该代码?

5

您可以以编程方式调整UITableView的大小,但是您也需要以编程方式创建UITableView。不要使用Storyboard。

+0

是的,据我了解,这是正确的。您必须以编程方式创建表格视图来调整其大小。 – Veeru 2013-12-10 06:02:08

+0

这是正确的答案。令人震惊的是,你仍然无法在Xcode 6.3的故事板上做到这一点 – 2015-06-29 22:28:56

4

我有同样的问题,只是需要从

- (void) viewDidLoad 

的代码移到

- (void)viewDidAppear:(BOOL)animated 
相关问题