自动布局与帧大小

所以我有点尴尬地问这个因为它看起来很简陋,但自从开始iOS开发(大约一年的自我/互联网教学)以来,当不使用故事板时,我非常依赖于帧大小并且非常谨慎地使用了自动布局。 在目标CI中发现自己处于需要更频繁使用自动布局的情况,但是使用Swift我可以为框架的x和y原点,它的中心等设置动画…我从未遇到过我无法完成的情况想要单独使用帧大小和像素位置,我已经做了一些相当复杂的视图工作。 我的问题是,使用自动布局而不是帧大小和像素位置有什么好处? 由于无知和习惯,我不想错过一些很好的性能优势。 非常感谢!

tl; dr了解如何使用自动布局 – 这对于真实世界的应用来说是一个巨大的节省时间!

答案很长:

最后,如果您想使用Apple提供的自动布局或大小类等function,则由您决定。 这些产品的主要优点在于最终产品中的UI渲染并不是真正的性能 。 如果您计划开发适用于不同屏幕尺寸和方向的应用程序,那么您需要投入时间考虑所有边缘情况

假设您想要完成所有需要做的工作,以支持iPhone 4 / 4s屏幕尺寸,iPhone 5 / 5s屏幕尺寸,iPhone 6 / 6s(Plus)屏幕尺寸和iPad屏幕尺寸以及所有的纵向和横向模式以上屏幕尺寸自己( 这里是一个很好的概述):嗯,它没有任何问题,只是为了它。 当然,您需要非常仔细地测试内容并始终保持此列表的最新状态 – 在每个应用程序中您使用自己的解决方案。 如果这是给你的,那就去做吧。

但是大多数人都希望在没有过多的屏幕尺寸等问题的情况下解决问题。 您当然可以从一个应用程序中提取自己的逻辑,以便在所有应用程序中使用它,这正是自动布局和屏幕大小的含义。 简而言之,Apple已经完成了所有工作,使您的框架设置在不同的屏幕上工作 。 你只需要使用他们的新词汇(Constraints)来使它工作。

换句话说:它是一个直接处理屏幕渲染逻辑抽象层 。 如果你不喜欢它,那就放手吧。 但是,如果你打算做一些应该在不同的iPhone / iPad上工作的严肃的应用程序,并且还计划维护那些,那么, 请学习如何使用自动布局和大小类来做事 。 它将在开发过程中节省您和所有未来的维护人员

一个很好的起点是文档 。 或者像raywenderlich.com上的这样的教程。

Apple自己说了以下这个难题(在上面链接的文档中):

在许多方面,以编程方式定义视图的框架提供了最大的灵活性和function。 当发生更改时,您可以根据需要进行任何更改。 但是,由于您还必须自己管理所有更改,因此布置简单的用户界面需要花费大量精力进行设计,调试和维护。 创建真正的自适应用户界面会使难度增加一个数量级。

BTW:使用自动布局或框架关于编程语言没有任何区别:Swift和Objective-C都非常好地支持这两种方式。 看来你还没有找到如何改变Obj-C中的帧。 ;)

还有一件事:也不需要使用Storyboard来使用自动布局。 您可以使用代码中的自动布局。 请参阅此处的文档。 甚至有很多框架试图让这更容易(Apple的原始API在许多方面往往不是很漂亮),我可以推荐SnapKit 。

依赖于帧大小等于计算大小。 当使用百分比或比例时,它可以在不同的手机型号上工作,但在几个分辨率上看起来仍然有些奇怪。 然后你会添加另一个条件语句,因为例如在iPhone 4s上你会想要一些不同的布局。 您的代码越来越复杂,可能会导致任何更改都存在风险。 这是可行的,但为什么重新发明轮子?

像基本约束这样的工具有时会替换布局的巨大逻辑块。 当第二个标签延伸时压缩一个标签的逻辑意味着很少的ifs。 想想10个标签。 随着大小类的增加,启用/禁用约束,压缩和拥抱,自动布局对我来说已经变得无法替代,我建议看看它,因为大多数公司都在使用它,如果不是在故事板中,那么在xibs或者代码,但具有自动布局。

Auto Layout的开发允许程序员在iOS上编写程序,用于任意大小的屏幕和视图。 以前,对于iPhone的前四代产品,iOS开发人员可以将他们的设计定位到一个屏幕尺寸,但是最近的历史表明Apple开放制作不同形状和尺寸的硬件。 自动布局提供了一种创建UI的便捷方式,可以适应不同的屏幕和视图尺寸。 可以开发没有自动布局的UI,以利用不同的视图尺寸吗? 是。 但是为了使用多个UI元素制作真正可resize的视图,通常程序员不得不求助于调整相对于其他UI元素的元素,这些元素本身必须具有大小和位置。 例如:

NSString *nameString = [NSString stringWithFormat:@"%@", self.name]; CGSize nameSize = [nameString sizeWithAttributes:attribs]; [nameString drawAtPoint:CGPointMake(self.bounds.size.width*0.5-nameSize.width*0.5, IMAGE_INSET+4*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight) withAttributes:attribs]; questionFont = [UIFont systemFontOfSize:self.bounds.size.height*0.025]; attribs = @{NSFontAttributeName: questionFont, NSParagraphStyleAttributeName:paragraphStyle}; NSString *maleString = [NSString stringWithFormat:@"%@", self.male]; CGSize maleSize = [maleString sizeWithAttributes:attribs]; [maleString drawAtPoint:CGPointMake(self.bounds.size.width*0.5-maleSize.width*0.5, IMAGE_INSET+5*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight+nameSize.height) withAttributes:attribs]; NSString *femaleString = [NSString stringWithFormat:@"%@", self.female]; CGSize femaleSize = [femaleString sizeWithAttributes:attribs]; [femaleString drawAtPoint:CGPointMake(self.bounds.size.width*0.5-femaleSize.width*0.5, IMAGE_INSET+6*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight+nameSize.height+maleSize.height) withAttributes:attribs]; NSString *babyString = [NSString stringWithFormat:@"%@", self.baby]; CGSize babySize = [babyString sizeWithAttributes:attribs]; [babyString drawInRect:CGRectMake(IMAGE_INSET+CONTENT_BUFFER(self.bounds.size.height), IMAGE_INSET+7*CONTENT_BUFFER(self.bounds.size.height)+facePicHeight+nameSize.height+maleSize.height+femaleSize.height, self.bounds.size.width-2.0*(IMAGE_INSET+CONTENT_BUFFER(self.bounds.size.height)), babySize.height) withAttributes:attribs]; 

整件事情可能会变得有点笨重。 显然有些视图比其他视图更简单,但如果您有复杂的视图,您希望支持多任务和本地化以及其他会影响UI布局的事情,那么使用自动布局通常会容易得多。