Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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 视图控制器框架设置的建议模式?_Ios_Cocoa Touch_Design Patterns - Fatal编程技术网

Ios 视图控制器框架设置的建议模式?

Ios 视图控制器框架设置的建议模式?,ios,cocoa-touch,design-patterns,Ios,Cocoa Touch,Design Patterns,我在iOS dev中多次遇到以下操作序列,但始终不知道建议的实现模式是什么: 1) 视图控制器A创建新的视图控制器B 2) A设置B视图的框架 3) B然后创建自己的子视图,该子视图需要相对于自己视图的框架调整大小 请注意,这假设B无法计算出自己的帧,它需要从更高阶的VC设置 因此,考虑到以下代码: b = CustomViewController() b.frame = CGRectMake(...) 人们会发现,如果他们试图在B的viewDidLoad中引用self.frame,则该框架

我在iOS dev中多次遇到以下操作序列,但始终不知道建议的实现模式是什么:

1) 视图控制器A创建新的视图控制器B

2) A设置B视图的框架

3) B然后创建自己的子视图,该子视图需要相对于自己视图的框架调整大小

请注意,这假设B无法计算出自己的帧,它需要从更高阶的VC设置


因此,考虑到以下代码:

b = CustomViewController()
b.frame = CGRectMake(...)
人们会发现,如果他们试图在B的
viewDidLoad
中引用
self.frame
,则该框架还不可用。因此,这种方法失败了。可以向B添加新方法,如
createViews
或其他方法,甚至可以利用
layoutSubviews
,但这两种方法都是笨拙的或可能不正确的选择


我尝试过的另一种方法是制作一个与initWithFrame相当的自定义初始值设定项,然后将新视图创建放在init中,虽然这样做有效,但它似乎与苹果的Cocoa基本设置相反,其中UIViews具有initWithFrame,UIViewController仅具有init或initWithNibName


这里推荐的模式是什么?

推荐的模式是使用自动布局。这根本不能解决这种情况……是的,它可以。您关心的是谁应该设置彼此的框架(在autolayout中,框架不应该是任何人),更重要的是,您关心的是如何处理B的子视图。如果B的子视图使用自动布局,则设置B的视图框架的人、方式或时间无关紧要(同样,应该由您添加的自动布局约束来处理)因为B的子视图的自动布局约束将始终自我调整以正确适应B。并且A和B之间的自动布局关系应设置在B添加到A的位置。步骤2应为“A设置B的自动布局约束”(这意味着A在B的最上面的视图和它添加了B的A的任何视图之间定义了约束)。您的步骤3应该是“B没有更多的事情要做,因为它的自动布局约束已经在interface builder中设置,或者我曾经以编程方式将它的子视图添加到它自己的位置”。