使用带有小型表的UITableViewController?

时间:2008-10-21 18:33:21

标签: iphone objective-c cocoa-touch uitableview

当使用UITableViewController时,initWithStyle:方法会自动创建底层的UITableView - 根据文档 - “正确的尺寸”。

我的问题是这些“正确的尺寸”看起来是320x460(iPhone的屏幕尺寸),但是我将这个TableView / Controller对推到了一个UINavigationController中,它本身包含在UIView中,它本身大约是一半的高度。屏幕。

没有任何框架或边界争论似乎可以正确地重置表的大小,因此它“太长”,这意味着有一系列行被推离屏幕底部并且不可见滚动也无法达到。

所以我的问题归结为:告诉UITableViewController将其组件UITableView调整为指定矩形的正确方法是什么?

谢谢!

更新我已经尝试了这里建议的所有技术无济于事,但我确实发现了一件有趣的事情:如果我完全避开UINavigationController(我不愿意为生产做,但作为一个实验),并将表视图添加为我提到的封闭视图的直接子视图,给出了给定的帧大小非常时刻我重新将UINavigationController引入混合中,无论是在表视图之前还是之后添加为子视图,无论是在表视图之前还是之后的alloc / init作为子视图添加,结果与之前相同。

我开始怀疑UINavigationController不是团队合作者......

更新2 在屏幕上的表格视图之后检查帧大小的建议很好:事实证明导航控制器实际上在加载和显示之间的某个时间调整大小。我的解决方案,最好是hacky,一直缓存加载时给定的帧,如果在tableView:cellForRowAtIndexPath:的开头更改,则重置它。你问为什么?因为这是我找到的有效的地方,所以这就是原因!

我不认为这是一个解决方案,因为它显然是不合适的,但为了其他人阅读的好处,它似乎确实有效。

11 个答案:

答案 0 :(得分:11)

为什么不使用常规的UIViewController并手动创建表?

答案 1 :(得分:6)

我有同样的问题,我解决了它:

-(void) loadView {
    [self setView:[[[UIView alloc] initWithFrame:CGRectZero] autorelease]];
    [[self view] setAutoresizesSubviews:NO];

    /* Create & configure table and other views... */

    [self setResultsTable:[[RadarTableViewController alloc] initWithNibName:nil bundle:nil]];
    [[resultsTable view] setFrame:CGRectMake(0,45,320,200)];
}

这是在父(在我的情况下只是一个简单的UIViewController)控制器中完成的。

答案 2 :(得分:3)

我遇到了同样的问题,我通过调整UITableViewController的viewDidAppear函数中的tableView来解决它。不是理想的解决方案,但它有效。

答案 3 :(得分:2)

您可以使用以下方式设置上边距:

    UIEdgeInsets inset = UIEdgeInsetsMake(50, 0, 0, 0);
    self.tableView.contentInset = inset;

这不是一个好习惯,如果你想要更多空间,你可以使用它。

不应该使用UITableViewController,只需使用UIViewController并以编程方式创建UITableview

答案 4 :(得分:1)

我同意Ben的回答。由于视图上的其他控件,我经常遇到需要调整UITableVIew大小的情况。

我通常只有一个带有UITableView IBOutlet的常规UIViewController。然后,如果我需要,我可以操纵UITableView对象的框架,使其达到我需要的大小。

答案 5 :(得分:1)

我不确定你为什么要为你的桌子创建一个额外的视图控制器。但是,在您的代码中,我没有看到您将表视图添加到其父级。您也可以尝试减小边界高度,直到整个事物出现在屏幕上;一旦你这样做,它可以让你深入了解为什么它没有像你期望的那样工作。

答案 6 :(得分:1)

检查UITableView的autoresizingMask和contentMode属性。这些都会影响框架。

答案 7 :(得分:1)

我通过此代码解决了这个问题

{
    UIEdgeInsets insets;
    insets.left = 0;
    insets.right = 0;
    insets.top = 0;
    insets.bottom = 60;
    self.tableView.contentInset = insets;
    [self.tableView setScrollIndicatorInsets:insets];
}

答案 8 :(得分:0)

如果您使用的是Interface Builder,只需转到“Table View Size”属性窗口,然后使用另一个小部件的高度更改Content和Scroller的Bottom Insets。

答案 9 :(得分:0)

尝试:

self.edgesForExtendedLayout = UIRectEdgeNone;

//This one in case your NavigationController is not Translucent
self.extendedLayoutIncludesOpaqueBars = NO; 

希望这有帮助。

答案 10 :(得分:-2)

UINavigationController

中设置框架