2010-09-13 49 views
1

(IPhone的新手问题)IPhone UIView - 如果UIViewController的大小事先未知,应该如何处理UIView的大小?

我一个子类的UIViewController 一个的UIView,创造了InitWithFrame的视图。我的自定义控制器使用它在其功能loadView中逐帧初始化其视图。

我打算在不同的地方使用我的代码中的控制器和视图。有时在导航控制器,工具栏下,两者都没有,等等。这意味着创建控制器的视图的代码应理想地知道以何种大小创建视图。

如何避免在不同情况下对这些尺寸进行硬编码?有没有办法建立周围的控制器(导航栏等),然后找出可视框架的大小,然后以某种方式创建我的控制器并使用此框架大小初始化我的自定义视图?

如果我的设计不正确,任何提示都可能有很大帮助......谢谢!

回答

1

对于您可能对[UIScreen applicationFrame]感兴趣的初始vew尺寸。返回的矩形占了状态栏和界面方向。当你的控制器被用在导航控制器或其他改变可用屏幕空间的包装中时,我认为视图会自动调整大小(通过UIViewController魔术),所以你不需要做任何事情(除了设置允许的autoresizingMask)。

+0

谢谢zoul。虽然,我不确定该怎么做。由于applicationFrame无法考虑导航控制器等,这是否意味着我的控制器将不可避免地以错误的大小绘制其视图?我不想依靠自动修复魔法。我不相信魔法:) – DannyA 2010-09-13 19:55:42

+1

你必须实际使用:'[[UIScreen mainScreen] applicationFrame]'@DannyA:我可以看到有些情况下自动调整大小不会理想 – Casebash 2010-09-22 07:46:11

+0

看起来像其他UI元素知道他们所处的界限。这是怎么发生的?例如,ScrollView将内部视图精确地滚动到可见区域结束的位置,就好像它“知道”它是否在tabbar内。它如何知道? [如果我知道这是不可能的,让我知道,我会批准答案] – DannyA 2010-10-14 11:03:51

0

这里是我如何解决类似的问题:我想:

  • 创建可重用的,独立的“微件模块班”实行从多个UIKit的组件构建一个复杂的视图(和其他嵌套小部件模块类!)。这些小部件类的高级客户类不关心UILabel是什么,小部件内部是什么UIImageView,客户只关心“显示分数”或“显示团队标识”。

  • 一个微件模块类中,奠定了窗口小部件和联播网点UI使用界面生成器

  • 对微件的更高水平的客户,我希望能够放置小工具的框架内在Interface Builder客户,而不必设计定制插件IB视图等

这些小窗口不是顶级控制器:所以它是没有意义对它们进行的UIViewController的子类。接下来还有苹果的建议,一次在可见屏幕上不要有多个VC。另外,还有如此多的建议和意见,比如“MVC!MVC!”,您必须将视图和控件分开!MVC!“人们强烈建议不要继承UIView子类或将应用程序逻辑放在UIView类中。

但无论如何我决定这么做(子类UIView)。我已经围绕这个区块几次了(但对于iPhone SDK/UIKit还是比较新的),并且我对设计非常敏感,这很丑陋,而且可能会导致问题,我坦率地看不出问题所在在这里继承UIView的子类。事实上,有许多优势,让您的可重复使用的小部件的UIView的一个子类,而不是进行基础的UIViewController:

  • 你可以把在客户视图的界面构建布局Widget类的直接实例,以及当客户类从xib加载时,widget视图的UIView框架将被正确初始化。这对我来说比在客户中放置一个“占位符视图”要干净得多,然后以编程方式实例化窗口小部件模块,并将窗口小部件的框架设置为占位符框架,然后交换占位符视图以获取窗口小部件的视图。

  • 您可以创建一个干净而简单的xib文件来在界面构建器中布置小部件的组件。 nib文件包含所有GUI布局的另一个UIView,然后在小部件的awakeFromNib:函数中,将此nib视图作为子视图添加到小部件本身。如果需要的话,任何帧大小调整都可以在这里处理,完全在小部件代码中。

  • 小部件通过在自己的awakeFromNib方法中使用NSBundle的loadNibNamed:owner:options方法自行初始化其用户界面,因此小部件与客户类的集成是干净的:只需将UIView放入IB的客户视图中,改变的UIView的类MyWidgetView,并在客户的init或viewDidLoad中使用自己编写的窗口小部件的API设置的任何默认值在窗口小部件的显示(setScore:setTeamImage:等)

在我看来,有以这种方式创建可重用的“小部件”并使用UIViewController来划分UIView是非常非常小的区别。在这两种情况下,小部件的.h文件都充满了成员,出口,动作声明和特殊的API声明。在这两种情况下,小部件的.m文件都充满了操作实现和特殊的API实现。视图与控件分离 - 视图位于xib文件中!

因此,简言之,这是我做包装起来复杂的可重复使用的视图控件:

  • 使Widget类的UIView
  • 实例化,无论你想要的部件,在其他视图的子类你的应用程序直接在IB。
  • 在IB中设计你的小部件的UI。
  • 在widget类的awakeFromNib
  • :方法,从厦门国际银行加载控件的UI做 [self addSubview:theXibView]

  • 代码的小部件就像你一个UIViewController:网点,行动,特殊的API

我有兴趣了解用于创建可重用小部件的其他结构系统,以及这种方法的优点是什么。

编辑:忘了提及,如果小部件需要将事件报告给客户类,那么只需使用委托协议,客户将小部件的委托设置为self。