如何理解table.autoresizingMask的行为?

时间:2012-08-31 01:02:10

标签: ios uitableview uiviewcontroller

我了解到,在UITableView中,在viewDidLoad中设置table = [[UITableView alloc] initWithFrame:self.view.bounds]; table.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:table]; 覆盖整个主视图(全宽和全高)的正确方法是:self.view.bounds

viewDidLoad

请注意,如果物理iPad 2保持在横向模式,并且如果上面的{{0, 0}, {768, 1004}}打印在UIViewAutoresizingFlexibleWidth内,则会显示:UIViewAutoresizingFlexibleHeight。所以我认为这个想法是:不要担心宽度和高度不正确,因为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)];

甚至

{768, 1004}

或最终"正确的值":

CGRect

当iPad 2保持在横向位置时。但是现在这张桌子并没有完全扩展到整个主视图。那么这里的治理原则是什么?宽度和高度可能设置不正确,但在{200, 200}时必须不正确?它可能不正确"与其他价值观?如果没有给出viewDidLoad,或者给出了一些虚拟值{{1}},{{1}}中的代码应该如何使表格具有完整的主视图的宽度和高度,它是横向还是纵向模式?

3 个答案:

答案 0 :(得分:1)

请勿使用bounds,而是使用frame

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

答案 1 :(得分:1)

UIAutoresizingFlexibleWidth意味着当其超视图的宽度扩展和缩小时,视图的宽度将扩展和缩小。 UIAutoresizingFlexibleHeight对于身高来说意味着同样的事情。添加这些相当于打开"弹簧"在Interface Builder中。我想如果没有" struts"设置,当superview的宽度加倍时,视图的宽度也会加倍。

支柱设置为:

  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoresizingFlexibleLeftMargin
  • UIViewAutoresizingFlexibleTopMargin
  • UIViewAutoresizingFlexibleBottomMargin

如果未设置UIViewAutoresizingFlexibleRightMargin,则打开右侧支柱。这意味着视图右侧和超级视图右侧之间的空间在视图展开时不会改变。所有其他边缘都有相同的概念。

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

我认为你对自己获得的自我视图感到困惑。这是旋转前视图的边界,因为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];

答案 2 :(得分:0)

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

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