我和这个人一直在斗争很长一段时间.假设我有一个UIViewController,需要在该控制器中放置一个带有UIImage的UIImageView.所以我有两种方法可以做到:
1.)通过故事板
2.) UIImageView *imageView = [UIImageView new];
imageView.frame = CGRectMake(bla, bla, bla);
[self.view addSubview: imageView];
此外,我需要支持不同的屏幕尺寸(从iPhone 4到iPhone6 +),并且对我来说,限制的自动布局并不完全清楚.而且我很喜欢
int wrapperHeight = (screen.height == 480) ? 100 : 200
我觉得我做错了什么.当我开始学习objective-c时,我看到了一些开源项目,根本没有故事板,所以我认为以编程方式添加视图是一种很好的做法.
你能解释一下"正确的方法"吗?
我会说大多数时候有自动布局的故事板是最好的选择.它有许多优点:
它将表示与逻辑分开.在控制器中创建整个界面通常是一个糟糕的设计.对于简单的接口,以命令式方式声明它们会带来很多开销.通常,您最终会有数百行代码,可以在10分钟内完成故事板或xib中的操作.
通过故事板,您可以获得一个精彩的WYSIWYG编辑器,您可以在其中查看屏幕在不同设备上的外观,而无需重建项目并在数十台设备或模拟器上运行.好吧,不是几十种而是4种不同的iPhone分辨率+ 2分辨率的iPad仍然很多.此外,视网膜和非视网膜屏幕之间的文本大小和渲染可能存在微小差异
自动布局.当然,你也可以在代码中使用它,但默认的苹果接口对它们很糟糕.有一些第三方库使得使用自动布局更容易一些,但无论如何使用故事板你都不会担心代码中的自动布局在大约80%的时间内.剩下的20%就像是向控制器添加约束出口,然后用一行代码改变它的常量或优先级
大小等级.同样,你可以在代码中使用它们,但是你可能不需要使用故事板.大小类允许您为所有可能的设备形状因子,不同的设备方向等设置单个接口.在大小类之前,开发人员必须拥有2组不同的iPhone和iPad接口.
但是,某些地方的故事板不是实现目标的最佳方式.例如,如果您有一些在应用程序的不同位置使用的视图.使用仅限故事板的方法,您必须在许多地方拥有此视图的副本,因此在对其中一个进行更改时,您必须记住在其他副本中进行此更改.在这种情况下,最好使用具有此类视图的单独xib文件,然后在故事板中使用它.
而且,就性能而言,自动布局可能非常昂贵.因此,如果您的应用程序开始滞后并且您确定(使用分析器)自动布局例程是滞后的原因 - 那么手动处理代码中某些视图的创建和布局可能是有意义的.但这可能只是一个非常复杂的接口.大部分时间表现都不是问题.
你说自动布局对你来说并不清楚.这不是拒绝使用它的理由.你需要做更多的工作才能使所有设备上的应用看起来都不错,而不需要自动布局.你看到的"一些开源项目"可能是为第一批iPhone(4s及之前)编写的,所有iPhone都具有相同的分辨率,所有尺寸和位置都可以硬编码.现在,正如我先前所说,我们已经有了十几种不同的分辨率.并且手动处理所有代码是一个真正的困难.Autolayout会让你的生活更轻松:)
您还可以看看有关何时何地使用故事板,xib和手动视图处理的争论:http://www.raywenderlich.com/51992/storyboards-vs-nibs-vs-code-the-great-debate
在同一个站点(http://www.raywenderlich.com)上,您还可以查找自动布局教程以更好地理解它.