1

我了解到UITableView,在单视图应用程序中设置覆盖整个主视图(全宽和全高)的正确方法是viewDidLoad

table = [[UITableView alloc] initWithFrame:self.view.bounds];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                             UIViewAutoresizingFlexibleHeight;
[self.view addSubview:table];  

请注意,如果物理 iPad 2 处于横向模式,并且self.view.bounds上面打印在里面viewDidLoad,它将显示: {{0, 0}, {768, 1004}}。所以我认为这个想法是:不要担心宽度和高度不正确,因为UIViewAutoresizingFlexibleWidthandUIViewAutoresizingFlexibleHeight会自动设置正确的宽度和大小。

所以我实际上尝试将上面的第一行替换为:

table = [[UITableView alloc] init];

或者

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];

甚至

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 1004, 768)];

或最终的“正确值”:

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 1024, 748)];

当 iPad 2 处于横向位置时。但是现在表格不会完全扩展到整个主视图。那么这里的管理原则是什么?宽度和高度可以设置错误,但一定是错误的{768, 1004}?它不能与其他值“不正确”吗?如果没有CGRect给出,或者给出了一些虚拟值,那么无论是横向还是纵向模式{200, 200},代码应该如何使表格具有完整的主视图的宽度和高度?viewDidLoad

4

3 回答 3

1

不要使用boundsframe改用:

table = [[UITableView alloc] initWithFrame:self.view.frame];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                         UIViewAutoresizingFlexibleHeight;
于 2012-08-31T05:36:39.710 回答
1

UIAutoresizingFlexibleWidth 表示当其父视图的宽度扩大和缩小时,视图的宽度会扩大和缩小。UIAutoresizingFlexibleHeight 对高度意味着同样的事情。添加这些相当于在 Interface Builder 中打开“弹簧”。我认为如果没有设置“struts”,当超级视图的宽度加倍时,视图的宽度也会加倍。

支柱设置是:

  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoresizingFlexibleLeftMargin
  • UIViewAutoresizingFlexibleTopMargin
  • UIViewAutoresizingFlexibleBottomMargin

如果 UIViewAutoresizingFlexibleRightMargin 未设置,则打开右支柱。这意味着当视图扩展时,视图右侧与其父视图右侧之间的空间不会改变。相同的概念适用于所有其他边距。

这里也有很好的讨论:https ://stackoverflow.com/a/10470469/472344 。

我认为您对获得的 self.view.bounds 感到困惑。这是旋转前视图的边界,因为 jrturton 指出高度是 1004,因为状态栏减去了 20 个像素。我不知道为什么旋转后宽度和高度没有更新(我假设您的旋转发生在加载视图之前,否则打印出的边界正是您应该期望的),但我也注意到了这一点回转。我在 Stackoverflow 上看到过一些关于此的讨论,但目前我找不到。

我的猜测是,正如 jrturton 所说,加载视图时,它使用 xib(或情节提要)中设置的边界,并且在 viewDidLoad 之后调整大小。也许尝试在 viewDidAppear 中打印出 self.frame.view 的边界,因为那时边界应该已经改变了。

要再次解决自动调整大小掩码设置的行为,请了解除非视图的超级视图更改大小,否则这些不会执行任何操作。自动调整大小掩码设置将告诉您的视图如何在其超级视图更改大小时自动调整大小。如果您希望您的表格视图始终具有与 self.view 相同的大小(例如在旋转或缩放之后),您需要完全按照您所做的那样设置它:

table = [[UITableView alloc] initWithFrame:self.view.bounds];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                         UIViewAutoresizingFlexibleHeight;
[self.view addSubview:table];
于 2012-08-31T13:40:31.633 回答
0

1004 是正确的 - 状态栏是 20px。您的第一个代码段很好。

请注意,在 viewDidLoad 中,您的视图方向仍然是纵向的 - 因此您看到的数字。调整大小发生在之后。使用主视图的边界矩形作为子视图的框架将始终让子视图填充整个视图。

于 2012-08-31T06:05:58.497 回答