Ios 如何理解table.autoresizingMask的行为?

Ios 如何理解table.autoresizingMask的行为?,ios,uitableview,uiviewcontroller,Ios,Uitableview,Uiviewcontroller,我了解到,在单视图应用程序中设置覆盖整个主视图(全宽和全高)的UITableView的正确方法是,在viewDidLoad: table = [[UITableView alloc] initWithFrame:self.view.bounds]; table.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [s

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

table = [[UITableView alloc] initWithFrame:self.view.bounds];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                             UIViewAutoresizingFlexibleHeight;
[self.view addSubview:table];  
请注意,如果物理iPad2以横向模式持有,并且上面的
self.view.bounds
打印在
viewDidLoad
中,它将显示:
{{0,0},{768,1004}
。因此,我的想法是:不要担心宽度和高度不正确,因为
UIViewAutoresizingFlexibleWidth
UIViewAutoresizingFlexibleHeight
将自动设置正确的宽度和大小

因此,我实际上尝试将上面的第一行替换为:

table = [[UITableView alloc] init];

甚至

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 1004, 768)];
或最终的“正确值”:


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

不要使用
边界
,而是使用
框架

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

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


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

UIAutoresizingFlexibleWidth表示视图的宽度在其superview的宽度扩展和收缩时会扩展和收缩。UIAutoresizingFlexibleHeight对高度的含义相同。添加这些功能相当于在Interface Builder中启用“弹簧”。我认为,如果没有设置“struts”,当superview的宽度加倍时,视图的宽度也会加倍

支柱设置为:

  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoResisingFlexibleLeftMargin
  • UIViewAutoResisingFlexibleTopMargin
  • UIViewAutoResisingFlexibleBottomMargin
如果未设置UIViewAutoResisingFlexiblerRightMargin,则右侧支柱将打开。这意味着视图右侧与其超级视图右侧之间的空间在视图展开时不会改变。同样的概念适用于所有其他利润

这里有很好的讨论:

我想你被你的自我观所迷惑了。这是旋转前视图的边界,正如jrturton指出的,高度是1004,因为状态栏减去了20个像素。我不知道为什么旋转后宽度和高度没有更新(我假设您的旋转发生在加载视图之前,否则打印的边界正是您应该期望的),但我也注意到了这一点。我看过一些关于Stackoverflow的讨论,但我现在找不到

我的猜测是,正如jrturton所说,当加载视图时,它使用在xib(或故事板)中设置的边界,并且在viewDidLoad之后进行大小调整。可能尝试在ViewDidDisplay中打印self.frame.view的边界,因为此时边界应该已更改

要再次解决自动调整大小遮罩设置的行为,请理解,除非视图的superview更改大小,否则这些设置不会起任何作用。“自动调整大小”遮罩设置将告诉您的视图如何在其superview更改大小时自动调整大小。如果希望表视图的大小始终与self.view相同(例如在旋转或缩放之后),则需要完全按照所做的操作进行设置:

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

使用父视图的框架设置子视图的框架不是一种好的做法。事实上,它们是不相关的。如果它起作用,那只是碰巧起作用。“实用主义程序员”可能会这样做,但我不喜欢做任何工作。我怀疑7681004的意思是“填充整个视图”,调整大小将相应地遵循和缩放以“填充整个视图”……不,如果您设置显式的帧大小,这将是帧大小。它将随着superview边界的更改(在旋转时发生)而调整大小。没有“解释”的框架意味着全屏。
table = [[UITableView alloc] initWithFrame:self.view.frame];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                         UIViewAutoresizingFlexibleHeight;
table = [[UITableView alloc] initWithFrame:self.view.bounds];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                         UIViewAutoresizingFlexibleHeight;
[self.view addSubview:table];