以编程方式创建视图是一件坏事吗?

10

我是iOS开发的新手,发现通过编程方式创建视图更容易。所以我的视图中包含了UIView、ScrollView、UIButton和UILabel等控件,这些控件都是通过编程方式创建和定位的(因此我从来没有使用过AutoLayout)。

现在我已经基本完成了我的应用程序,并想要创建iPad视图,但我意识到也许像这样做并不太好。

这种做法是否不好,还是说我应该尽可能多地使用自动布局?

如果目前我这么做是可以的,那么添加iOS和iPad上不同的视图的正确方法是什么? 我在下面看到了如何查找设备的答案,一个简单的if else语句是否足够?- iOS: How to determine the current iPhone/device model in Swift?


2
不是完全没有,相反地,你会更好地理解和掌握代码。 - Jan ATAC
1
我赞同这个观点!在代码中创建它们并不排除使用自动布局,甚至(在我看来)使您的约束更清晰明了。 - Rupert
4
我们都知道大部分自动布局通常不会以编程方式使用。搜索“AutoLayout教程”在Google上,49/50的教程都不会使用这种程序化的方法。说“我不理解”听起来相当傲慢,因为任何人都可以看到,在这个问题的背景下,说“我从来没有使用过AutoLayouts”暗示着一种非编程的方法。 - Reece Kenney
1
在代码中使用自动布局有些棘手。要有效地使用它,您必须使用库。至少有20个不同的库,所以通常当您遇到使用这种库的代码时,您必须先学习它。在代码中调试约束非常困难 - 您永远看不到您错过了什么。然而,最大的区别在于维护时间。在IB中创建的约束的维护始终更快,更容易。不要编写不必要的代码。IB是您拥有的最强大的开发工具。使用它。 - Sulthan
1
@Poql认为AutoLayout是无用的(顺便说一下,没有人在使用),这并不是轻蔑的,所以你可能需要仔细检查一下你的定义。任何具有iOS开发知识的人都知道OP所说的“所以我从未使用过AutoLayout”的意思。你应该这样表达你的评论:“你推断AutoLayout是非程序化的。FYI,你也可以在编程中使用它”。 - Reece Kenney
显示剩余7条评论
4个回答

3
我正在使用编程视图来制作一个实时应用程序,这很棒。我认识的一群人也在使用它。
以下是我用来选择两种方法的小算法:
- 你是为客户或者业余制作快速应用程序吗?使用带有自动布局的故事板。 - 你正在构建一个将被许多人使用的开源项目吗?使用编程UI。 - 你正在制作一款长期运行的应用程序吗?(1+年)使用编程UI。
不使用自动布局制作旋转的应用程序更加困难。因为用代码实现这一点比自动布局要花费更多的工作。大多数优秀的应用程序都没有使用此功能,所以我没有看到太大问题。
一个好的提示是在编写编程UI时永远不要使用常量。
如果您要制作一个100像素宽的按钮,请不要在代码中输入100像素任何地方。相反,找出屏幕尺寸并根据屏幕尺寸放置主视图。然后根据主视图的位置放置子视图或次要视图。如果您正确执行此操作,您将拥有比自动布局更强大的多设备布局支持。
这是我写的一个小库,请检查并玩一下我如何放置视图的代码:https://github.com/goktugyil/CozyLoadingActivity/blob/master/CozyLoadingActivity.swift 此外,这是一篇我喜欢的好文章,讨论了这个问题:http://www.toptal.com/ios/ios-user-interfaces-storyboards-vs-nibs-vs-custom-code

谢谢。如果您使用编程方法,那么如何处理在iPad上可能有SplitViewController而在iPhone上只有标准的ViewController的情况? - user4591756
我没有相关经验,但我认为这不会太难。由于我所做的一切都与屏幕尺寸有关,我猜一切都会很顺利,但我可能会添加一个方法,在初始化splitviewcontroller时重新加载视图。屏幕尺寸可能会有一些问题,可能需要将其更改为当前应用程序大小。此外,编辑我的答案时,我想到了另一个缺点。 - Esqarrouth
1
将以下与程序相关的内容从英语翻译为中文。仅返回已翻译的文本:将以下步骤添加到您的算法中:
  • 您是否计划将应用程序移植到不同的形态因素?请使用自动布局。
  • 您是否正在制作一款使用非传统方式视图的游戏或其他应用程序?请使用编程 UI。
- e.w. parris
感谢您的请求。以下是程序相关内容的翻译:请发出修改请求。 - Esqarrouth

1

如果你有足够的时间、耐心、良好的计算技巧和不同UI元素之间的关系配置,那么这很好。

然而,使用自动布局比手动计算更加实用且节省时间。

我们可以轻松创建一个动态而多功能的界面,以最小的努力对屏幕大小、设备方向和本地化做出适当响应。

阅读采用自动布局,在现有应用程序中实现自动布局。


0

简而言之

这取决于情况


更长的版本

显然,一种尺寸并不适用于所有情况。AutoLayout 在 Interface Builder 和代码中都非常强大(无论是视觉语言格式还是简单的约束设置),但有时它似乎就像你在“用左手摸右耳朵” - 这时候通过编程方式添加视图就派上用场了。但要注意不要在每个视图控制器中都使用不同的方法 - 毕竟你不想在项目中引入太多复杂性,对吧?

我个人喜欢尽可能多地使用 AutoLayout,只有当我不能再使用它,或者 StoryBoard 视图会因为数百个约束而变得混乱不堪时,我才会将视图分离成容器 - 让容器由 AutoLayout 调整大小,并让子视图由代码处理。

例如,一个自定义媒体播放器 - 也许我想在视频下方和上方各有两条条纹 - 我可以让视频和两个 UIView 扩展条纹由 AutoLayout 处理。但是条纹本身的子视图(控件)将由代码添加。这样既可以控制我的代码,又不会引入太多复杂性。


0

首先 - 如果你想要开发iOS应用,你必须学习Autolayout。现在已经有很多不同分辨率的设备了different resolutions,未来可能还会有更多。

其次 - 如果你想要有效地使用IB,你必须阅读guide / 观看教程视频并进行一些实践。开始可能会有些困难,但是之后你会意识到IB是强大、快速且通常是开发GUI的最佳方式。通常是这样,但并非总是如此!

代码优势:

  1. 易于复制粘贴和重用GUI。如果你有几个类似的视图或者想要重用一些旧代码,这可能是至关重要的。
  2. 易于解决合并冲突和检查提交。
  3. 更容易制作样式 - 比如根据国家/地区为所有标签使用相同的字体。
  4. 更加强大(有些事情无法通过IB完成),因此有时必须使用它。

IB的优点:

  1. 您可以在开发过程中查看不同分辨率/本地化的GUI,因此无需在不同设备/模拟器上编译和运行项目以检查GUI是否正常。此外,IB会显示警告,如果您忘记了一些自动布局约束或存在冲突。如果您具有具有非平凡自动布局约束的复杂GUI,则可以节省大量时间。
  2. 如果使用IB开发,则更容易理解其他人的代码。对于复杂的GUI尤其重要-在数百行代码中找到所需的标签或按钮并不容易。
  3. 小奖励-如果您想使用通过代码开发的自定义控件,可以将其设置为IBInspectable并在IB中无问题地使用它

简而言之,如果您不需要使用IB的优势(例如GUI非常简单且不使用自动布局),通过代码开发GUI可能会更容易和更快。但是,如果您必须支持不同的分辨率和/或每个视图控制器中有数百行GUI代码,我强烈建议尝试使用IB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接