因此,我有点尴尬地问这个问题,因为它看上去太初级了,但从iOS开发开始(大约一年的自我/网络教学)开始,当我不使用故事板时,我一直严重依赖框架大小,很少使用自动布局。在目标C中,我发现我需要更频繁地使用自动布局,但使用Swift,我可以动画一个帧的x和y起源,它的中心,等等。我从来没有遇到这样的情况,我无法完成我想要的帧大小和像素位置,我做了一些相当复杂的视图工作。我的问题是,使用自动布局而不是帧大小和像素位置有什么好处?我不想因为无知和习惯而错过一些伟大的表演好处。非常感谢!
发布于 2015-11-22 21:33:43
tl;博士学习如何使用自动布局--它为现实世界的应用程序节省了巨大的时间!
长答案:
最后,如果您想使用Apple提供的自动布局或大小类等功能,则由您决定。它们的主要好处是而不是,在最终产品的UI呈现方面,真正的性能。如果你计划开发一个适用于不同屏幕大小和方向的应用程序,那么现在你需要投资考虑所有的边缘情况。
假设您想做所有您需要做的工作,支持iPhone 4/4s屏幕大小、iPhone 5/5s屏幕大小、iPhone 6/6s屏幕大小和iPad屏幕大小,以及所有上述屏幕大小的肖像画和景观模式(这里是一个很好的概述):嗯,它没有什么问题,就去做吧。当然,您需要非常仔细地测试这些内容,并且始终保持最新的列表--在您正在使用的每个应用中。如果这是您自己的解决方案,那么就去做吧。
但大多数人都想把自己的想法拿出来,而不想过多地面对不同屏幕大小的问题。当然,您可以从一个应用程序中提取您自己的逻辑,以便在所有应用程序中使用它,这正是Auto布局和屏幕大小的意义所在。简单地说,苹果已经做了所有的工作,让你的框架设置在不同的屏幕上为你的工作。你只需要使用他们的新词汇表(约束)就可以了。
换句话说:它是一个抽象层,在直接处理屏幕呈现逻辑的基础上直接使用。如果你不喜欢,就放手吧。但是,如果你计划在不同的iPhone/iPad代上运行一些严肃的应用程序,同时也计划维护这些应用程序,那么,请学习如何使用自动布局和大小类来完成一些工作。它将为您和所有未来的维护人员节省相当长的开发时间。
文档是一个很好的起点。或者像这一个 on raywenderlich.com这样的教程。
苹果公司(在上面链接的文档中)对这一困难表示了如下看法:
在许多方面,以编程方式定义视图的框架提供了最大的灵活性和威力。当发生更改时,您可以进行任何您想要的更改。但是,由于您还必须自己管理所有更改,因此设计一个简单的用户界面需要花费大量的精力来设计、调试和维护。创建一个真正的自适应用户界面会增加一个数量级的难度。
BTW:在使用自动布局或编程语言框架方面没有任何区别: Swift和Objective都很好地支持这两种方式。似乎你还没有找到如何改变Obj中的框架。;)
还有一件事:,您也可以,不需要使用故事板来使用自动布局。您可以从代码中使用自动布局。见docs 这里。甚至有很多框架试图使这更容易(从很多方面来说,苹果最初的API并不是很漂亮),我可以推荐SnapKit。
发布于 2015-11-22 01:04:32
依赖帧大小等于计算大小。当使用百分比或比例时,它可以在不同的手机型号上工作,但有时在很少的分辨率上看起来很奇怪。然后添加另一个条件语句,因为例如,在iPhone 4s上,您需要稍微不同的布局。您的代码越来越复杂,可能导致任何更改都有风险。这是可行的,但为什么要重新发明轮子呢?
像基本约束这样的工具有时会替换非常庞大的布局逻辑块。当第二个标签正在扩展时,压缩一个标签的逻辑意味着很少的ifs。想想10个标签。除了尺寸类,启用/禁用约束,压缩和拥抱,汽车布局已经成为不可替代的,我建议看看它,因为大多数公司正在使用它,如果不是在故事板,然后在xibs或代码,但与自动布局。
发布于 2015-11-22 01:02:59
自动布局是为了让程序员在iOS上为任意大小的屏幕和视图编写程序。以前,在iPhone的前四代,iOS开发人员可以将他们的设计定位在一个屏幕大小上,但正如最近的历史所显示的,苹果对生产不同形状和大小的硬件开放。自动布局为创建UI提供了一种方便的方法,可以适应不同的屏幕和视图尺寸。如果没有自动布局,用户界面是否可以利用不同的视图维度进行开发?是。但是,要使用多个UI元素生成真正的可调整大小的视图,程序员通常必须使用相对于其他UI元素的大小来调整元素的大小,而其他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布局的东西,那么使用自动布局通常要容易得多。
https://stackoverflow.com/questions/33850196
复制相似问题