(IPhone新手问题)
我已经将 UIViewController 和 UIView 子类化,并为视图创建了 InitWithFrame 。我的自定义控制器使用它在其 loadView 函数中逐帧初始化其视图。
我计划在不同的地方使用控制器并在我的代码中查看。有时导航控制器,工具栏,两者都没有。这意味着在控制器的 loadView 中创建视图的代码应该知道创建视图的大小。
如何避免针对不同情况对这些尺寸进行硬编码?有没有办法构建周围的控制器(导航栏等),然后找出可查看框架的大小,然后以某种方式创建我的控制器并使用此框架大小初始化我的自定义视图?
如果我的设计不正确,任何提示都可以提供很大的帮助......谢谢!
答案 0 :(得分:1)
对于最初的vew尺寸,您可能对[UIScreen applicationFrame]感兴趣。返回的矩形表示状态栏和界面方向。当您的控制器在导航控制器或其他更改可用屏幕空间的包装内使用时,我认为视图会自动调整大小(通过UIViewController
魔法),因此您无需做任何事情(除了设置一个允许的{ {1}})。
答案 1 :(得分:0)
以下是我解决类似问题的方法:我想:
创建可重用,自包含的“小部件模块类”,实现从多个UIKit组件(以及其他嵌套的小部件模块类!)构建的复杂视图。这些小部件类的高级客户类不关心什么是UILabel,小部件内部的UIImageView是什么,客户只关心“显示分数”或“显示团队徽标。”
< / LI> 在小部件模块类中,使用界面构建器为小部件和连接插座布置UI
对于窗口小部件的更高级别客户,我希望能够将窗口小部件的框架放置在界面构建器中的客户视图中,而无需为IB等设计自定义插件。
这些小部件不是顶级控制器:因此将它们作为UIViewController的子类是没有意义的。然后还有Apple的建议,一次不要在可见屏幕上有多个VC。此外,还有很多建议和意见,如“MVC!MVC!你必须将你的视图与你的控制分开!MVC!”人们强烈反对继承UIView或将应用程序逻辑放在UIView类中。
但无论如何我决定这样做(子类UIView)。我已经在这块了几次(但对于iPhone SDK / UIKit仍然相当新),而且我对设计非常敏感,这可能会导致问题,我坦率地看不到问题在这里继承UIView。事实上,使可重用小部件成为UIView的子类而不是基于UIViewController有很多优点:
您可以在客户视图的界面构建器布局中放置窗口小部件类的直接实例,并且在从xib加载客户类时,将正确初始化窗口小部件视图的UIView框架。这比我在客户中放置“占位符视图”,然后以编程方式实例化窗口小部件模块,并将窗口小部件的框架设置为占位符的框架,然后交换窗口小部件视图的占位符视图更加清晰。
您可以创建一个干净简单的xib文件,以在界面构建器中布置窗口小部件的组件。 nib文件包含另一个UIView,其中布局了所有GUI,然后在窗口小部件的awakeFromNib:函数中,此窗口视图作为子视图添加到窗口小部件本身。任何帧大小调整都可以在这里处理,完全在小部件代码中,如果有必要的话。
小部件通过在其自己的awakeFromNib方法中使用NSBundle的loadNibNamed:owner:options方法自行初始化其用户界面,因此将小部件集成到客户类中是干净的:只需将UIView放入IB中的客户视图中,将UIView的类更改为MyWidgetView,并在客户的init或viewDidLoad中使用您自己编写的小部件API(setScore:setTeamImage:等)在小部件的显示中设置任何默认值
在我看来,以这种方式子类化UIView以创建可重用的“小部件”和使用UIViewController之间存在非常非常小的区别。在这两种情况下,小部件的.h文件都包含成员,出口,操作声明和特殊的API声明。在这两种情况下,小部件的.m文件都充满了动作实现和特殊的API实现。并且视图与控件分离 - 视图位于xib文件中!
因此,总而言之,这就是我为打包复杂的可重用视图小部件所做的工作:
,从xib加载小部件的UI并执行
[self addSubview:theXibView]
像对待UIViewController一样对小部件进行编码:出口,操作,特殊API
我有兴趣了解用于创建可重用小部件的其他结构系统,以及这种方法的优势。
编辑:忘记提及,如果窗口小部件需要向客户类报告事件,只需使用委托协议,客户将窗口小部件的委托设置为自己。