Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:setFrame不再从viewDidLoad工作,或VIEWWILL出现_Ios_Ios6 - Fatal编程技术网

iOS:setFrame不再从viewDidLoad工作,或VIEWWILL出现

iOS:setFrame不再从viewDidLoad工作,或VIEWWILL出现,ios,ios6,Ios,Ios6,我更喜欢禁用autoresizesSubviews,并使用setFrame放置我的所有子视图。 从iOS 6开始,情况似乎发生了很大变化。 在viewDidLoad中对视图调用setFrame时,没有任何效果。我从视图中尝试了它将出现;同样的事情 setFrame调用将在WillAnimateRotationInterfaceOrientation中工作,但最初不像在iOS 5中那样调用 有人能澄清一下我应该从哪里布置视图吗?我想你应该从UIViewController布置视图。您是否尝试过在以

我更喜欢禁用
autoresizesSubviews
,并使用
setFrame
放置我的所有子视图。 从iOS 6开始,情况似乎发生了很大变化。 在
viewDidLoad
中对视图调用setFrame时,没有任何效果。我从
视图中尝试了它将出现
;同样的事情

setFrame调用将在WillAnimateRotationInterfaceOrientation中工作,但最初不像在iOS 5中那样调用


有人能澄清一下我应该从哪里布置视图吗?

我想你应该从UIViewController布置视图。您是否尝试过在以下位置执行布局任务:

根据苹果的文件:

视图控制器可以重写此方法,以便在视图布局其子视图后进行更改

由于视图本身不布局其子视图(不使用autosize、autolayout或LayoutSubView:),因此可以使用此方法执行布局任务

然而,优雅的方法是使用自定义父UIView并在那里执行所有布局,覆盖UIView的
布局子视图:
(除非您以友好方式添加/删除视图)。引用苹果公司关于以下内容的文档:

理想情况下,视图本身执行重新定位所需的所有工作,而无需视图控制器参与该过程。但是,如果视图控制器动态添加和删除视图,则可能无法在Interface Builder中进行静态布局。在这种情况下,视图控制器是控制过程的好地方,因为视图本身通常只有场景中其他视图的有限图片


关于“要求视图展示自己对我来说没有意义。视图没有权力说它们应该去哪里。这是控制器的角色,不是吗?”。我认为答案往往是否定的。它是父视图(而不是视图控制器),通常起到布置自己的子视图的作用。它通过使用autoresizingMask或autolayout(仅限iOS 6)来实现。或者,您可以通过重写父视图的
-layoutSubviews
方法以编程方式进行布局

当然,正如前面提到的,控制器也可以通过覆盖
-(void)viewdilayoutsubviews
来参与布局过程。当我不想为保持简单而对视图控制器的顶层视图进行子类化时,我经常使用这种方法


最后,我发现这个超级有用。即使有一些小错误,这篇文章也提供了视图布局过程的大图

如果取消选中Interface Builder中的“自动布局”选项,则可以在
viewDidLoad
中使用
setFrame
。如果需要使用自动布局,则需要在
viewdilayoutsubview:
中执行布局任务


要求视图进行布局对我来说没有意义。观点没有权力说他们应该去哪里。这就是控制器的角色,不是吗?UIViewController有一个视图属性,它指向一个视图:视图控制器的内容视图。此单一视图负责显示与控制器相关的所有内容。理论上,此单一视图知道其所有子视图及其布局。请思考为什么视图控制器有一个名为“viewDidLayoutSubviews”的方法。因为子视图的布局应由(内容)视图负责。的确,也可以从控制器中布局子视图,这不一定是一种坏的做法。我一直发现苹果的想法,自动调整大小应该被用于某种脑死亡。他们没有读过关于用户界面设计的书吗?自动调整视图大小的机制永远不会产生理想的子视图布局。布局必须由设计UI的人员完成。自动方法与良好的设计背道而驰,我很惊讶以前由史蒂夫·乔布斯经营的公司会提倡这种方法。也许,如果您的唯一子视图是一个表,那么自动布局是合适的。但是,如果你有各种各样的子视图,那么自动化布局就没有意义了。我同意你的观点,尽管iOS6引入的新的自动布局功能比自动调整大小有用得多(当然,与以前的iOS版本不向后兼容)。不管怎样,我们在这里讨论的是如何从代码中进行布局。。。如果我的回答有帮助(你后来删除的第一条评论说viewDidLayoutSubview适合你),那么请接受答案;我在从情节提要加载视图时遇到问题,在视图中重新定位某些内容似乎不起作用。将setFrame移动到viewDidLayoutSubviews是可行的。你也禁用了自动布局吗?哇,没注意到。谢谢你的提醒,现在我正在做我所有的早期布局。
- (void)viewDidLayoutSubviews