Tag: iOS应用开发

我2018年最好的第三方iOS库

在过去的几个月中,我接受了挑战,将我的理论ios技能付诸实践。 我们有一个仅在Android平台上存在的应用程序,我们需要创建一个iOS应用程序,以便迎合使用iOS设备的客户。 与往常一样,在构建应用程序时,使用由其他开发人员构建,尝试和测试的第三方库是有意义的。 Github是我发现iOS很棒的开源库的最佳去处。 不要重新发明轮子,只需重新调整轮子即可。 —安东尼·安格洛 因为我不想重新发明轮子,所以我决定使用一些第3方库。 与我决定自己编写其中一些库相比,这减少了我的开发时间,并可能节省了一些调试时间(是,几天days)。 以下是一些帮助我构建iOS应用程序的库: Alamofire 大多数移动应用程序都与后端服务进行通信,而我们的服务也不例外。 我发现Alamofire是一个易于使用的Swift网络库。 感觉就像是iOS开发生态系统的翻新。 我还能够快速将插件功能添加到库中,因为其他开发人员已经构建了与Alamofire交互的出色库。 一些示例包括:AlamofireLogger和AlamofireJsonToObjects。 图表 Android开发人员熟悉MPAndroidChart。 该库与iOS / tvOS / OS X平台的Swift等效。 使用此库可以轻松创建精美的图表/图形。 我还喜欢每种图表类型的示例项目都易于理解和定制。 Firebase库 Firebase附带了许多可用于构建应用程序的库。 我主要使用性能库,Crashlytics和Firebase消息传递。 性能库有助于跟踪网络通话和屏幕渲染的质量。 Crashlytics可帮助您确定应用中的问题(严重和非严重错误)。 它有一个漂亮的仪表板,显示了相关信息,可以帮助修复开发人员来解决问题。 Firebase Messaging用于处理我们应用中的推送通知。 IQKeyboardManager 来自Android世界。 我真的不认为我会为软件键盘而烦恼,所以我很惊讶iOS默认键盘上没有简单的手势。 这样的图书馆让我很高兴。 使用IQKeyboardManger,我不必编写代码就可以在完成TextField编辑后关闭键盘,也不必编写代码以移至表单中的下一个字段,也不必编写其他代码来确保虚拟键盘不会显示时覆盖一个字段。 最好的部分是,我不必为此输入太多代码。 我刚刚添加了库和一行代码,所有这些开始工作。 SwiftValidator 只要您的应用程序中有像TextField这样的开放式字段,输入验证就很重要。 我使用SwiftValidator是因为它易于设置和使用。 当我开始使用该库时,有20条预定义的规则。 规则用于确保只有遵循验证规则,才能将TextField中的文本视为有效。 可可豆 不,这不是图书馆。 它是Swift的依赖项管理器。 我也必须潜入,因为它也很重要😉。 这就像Android世界的gradle 。 它帮助我简化了添加这些第三方库的过程。 如果不使用此依赖项管理器,则需要将依赖项(框架)作为嵌入式二进制文件添加到我的项目中,与使用CocoaPods相比,这不是一个简单的过程。 感谢您的阅读,并请让我了解其他可以简化iOS开发的开源库。 干杯👋🏻。

最大化iOS 11中的连接性

2017年8月24日 我们已经让您知道了要为iOS 11准备的事情,现在我们正在研究更具体的内容:即将到来的iOS更新将如何处理较差的网络连接。 外行用户只需要知道您使用的移动数据可能会比更新到iOS 11之前要多一些。但是对于我们的开发人员,我们将在下面深入探讨此主题。 戴上工程师帽! 在iOS 11中,Apple对URLSession系列API进行了许多改进。 这些改进从开发人员的生活质量更新到显着的性能提升,无疑将改善整个平台的用户体验。 在本文中,我们将特别介绍两项改进:URLSession内置的多路径TCP支持和可达性监视。 多路径TCP 优雅地处理恶劣的网络条件是应用程序精心打造和完善的必然标志。 与手机上的其他大多数应用程序相比,您是否注意到Siri似乎很少有连接问题吗? 原因是多路径TCP。 当Siri发出网络请求时,该应用实际上打开了与服务器的两个连接:一个通过Wi-Fi,一个通过蜂窝。 这些连接一起工作,可以尽快将数据传送到应用程序。 只要您的设备在两个通道之一上都具有良好的连接,Siri就可以正常工作。 多路径TCP是一种相对较新的协议,专门为移动设备设计。 它建立在TCP之上,因此可以从TCP内置的可靠性和拥塞控制中受益。 此外,MPTCP允许在无线和蜂窝连接之间无缝切换。 它甚至支持同时使用两个连接以提高吞吐量(稍后会对此进行更多介绍)。 为了利用MPTCP,在客户端和服务器级别都需要支持。 当前,并非所有服务器基础架构都支持MPTCP,但像AWS这样的流行供应商都支持。 使用iOS 11,应用程序开发人员现在也可以在客户端级别支持MPTCP。 模式 在iOS 11中,应用程序可以选择三种不同的MPTCP模式:切换模式,交互模式和聚合模式 切换模式:如果可能,将通过Wi-Fi建立连接。 如果Wi-Fi网络条件不佳,系统将自动启动蜂窝链路并将流量传输到该链路。 随着Wi-Fi条件的改善,流量将被转移回Wi-Fi连接,并且蜂窝链路将被拆除。 本质上,切换模式试图在保持可接受性能的同时最小化蜂窝使用。 所有这些都发生在URLSession中,并且对我们的应用程序完全透明。 交互模式:系统将立即启动Wi-Fi和蜂窝链接。 尽管仍然首选Wi-Fi,但如果发现Wi-Fi条件不理想,该系统将积极过渡到蜂窝网络。 交互模式针对性能进行了优化,但以蜂窝数据的使用为代价。 Siri使用交互模式。 聚合模式:与交互模式一样,系统将立即启动两个链接。 但是, 两个链接将一起使用以增加网络的整体吞吐量。 理论上,在10mbps Wi-Fi连接和5mbps蜂窝网络上使用聚合模式可能会导致与服务器的15mbps连接! 虽然这很酷,但会导致大量的蜂窝数据使用。 因此,Apple不允许在生产应用程序中运行聚合模式。 但是,开发人员可以通过“设置”应用中的“开发人员设置”屏幕使用汇总模式。 无论使用哪种模式,如果您的应用达到了Wi-Fi辅助数据限制,蜂窝链接将被禁用。 如果要测试应用程序,请注意这一点,并注意MPTCP不再切换到蜂窝网络。 这很好地表明您可能需要重新考虑哪些呼叫选择了加入MPTCP。 选择加入 那么,您如何选择加入? 苹果公司做到了这一点非常容易。 只需在Xcode中向您的应用程序添加“ multipath”功能,然后将URLSessionConfiguration上的multipathServiceType属性设置为.handover或.interactive。 而已! 可达性 […]

2018年将遵循的最新iPhone / iOS App开发趋势| HokuApps

iPhone应用程序是智能手机用户最想要和渴望的元素之一。 Apple在2018年对iOS进行严格的质量和功能标准,以确保iPhone应用程序开发公司在开发应用程序时仅遵循最高水平的创新和最新趋势。 应用程序的吸引力很大一部分是包含先进技术。 与DevOps的最新开发相一致的应用程序给用户留下了深刻的印象。 必须注意的是,如果没有对应用程序性能的正确判断,应用程序不应实施技术。 例如,在可能需要更好的视觉效果的情况下,增强现实在银行应用程序方面可能不会做很多事情来增强用户体验。 用户可能会喜欢使用由更新功能提供支持的应用程序,但前提是这些应用程序增加了便利性或美观。 投资与您的应用程序无关的技术不仅浪费财务资源,而且会使应用程序的导航性降低。 在新兴趋势中,以下与iPhone应用程序开发服务特别相关: iBeacon是指Apple技术标准,该标准使移动应用程序可以检测来自信标的信号并根据需要进行响应。 装有iBeacon的应用程序可以在微本地规模上检测自己的位置。 因此,它可以为用户提供有关其直接地理位置的信息。 例如,用于订购食物的应用程序可以根据用户所在的位置显示附近有哪些餐馆在营业。 信标技术为用户提供即时解决方案。 对于围绕紧急服务的应用程序而言,它尤其有用。 当您需要一分钟的医院并且对您的即时位置了解不多时,带有iBeacon的应用程序将派上用场。 对于需要在紧急情况下将用户位置传输到紧急联系人或警察局的SOS应用程序,它也是理想的选择。 互联网几乎渗透到现代智能手机用户生活的方方面面。 他们不仅使用具有互联网功能的电话,还使用平板电脑,手表,电视甚至汽车,而这些功能需要在线连接。 iPhone应用程序开发公司可以投资可在多个设备上运行的应用程序,所有这些应用程序都可以通过单个遥控器进行操作。 因此,可以将手机中的视频投射到电视的宽屏上的应用程序将非常合适。 由于较新的iPhone具有指纹ID功能,因此对于iPhone应用程序开发公司而言,将此功能用于应用程序是很有意义的。 对于确保购物,银行和其他涉及金融交易的应用程序的安全性特别有用。 但它为应用程序提供了多种可能性。 用户可以使用相同的指纹技术登录其业务应用程序。 iPhone应用程序开发公司正在认真参与云计算。 基于云的技术使程序员可以将应用程序与多个平台同步。 在为用户的文件提供更多存储空间时,它也特别有用。 但是, iPhone App Developer必须谨慎对待隐私,并在其云存储选项中嵌入毫不妥协的安全功能。 HokuApps iPhone应用程序开发服务提供256位加密,是大多数iPhone应用程序开发公司提供的标准128位加密的两倍。 企业市场已为iPhone商业应用程序极大地打开了大门。 Google文档,Microsoft Office,Wolfram Alpha,Genius Scan和其他工具已将工作流程系统化,为雇主和员工均带来了更大的便利。 商业应用值得投资,因为随着数字化世界的不断发展,企业不断增长。 员工需要随时随地应对工作压力。 他们需要可以在不限时间或地点的情况下完成工作的设备。 如今,随着企业在Internet上大范围运作,对iPhone商务应用程序的需求必然会扩大。 对于iPhone应用程序开发公司来说,紧跟最新的框架和工具以开发iPhone应用程序非常重要。 如前所述,未配备最新软件的应用程序不会在用户身上留下很多痕迹。 开发工具通常会进行改进,无论它们与构想,构造或测试有关。 iPhone应用程序开发服务应围绕使用哪些工具来创建最复杂,引人入胜的应用程序展开讨论。 用户界面(UI)和用户体验(UX)通常会成败一个应用程序。 每个iPhone应用程序开发公司都需要投入精力来研究哪种界面可以吸引用户使用应用程序。 如果iPhone应用程序开发服务要提供值得使用的应用程序,则以用户为中心的智能布局,设计,图形和高质量动画值得特别注意。 随着Apple定期更新iPhone应用程序开发指南,iPhone应用程序开发公司必须紧跟开发进度,这一点很重要。 增强现实(AR)无疑是我们这个时代最引人注目的技术里程碑之一。 它的相关性在游戏,教育,零售,维护和制造等各个领域均已确立。 每个iPhone应用程序开发公司都应认真考虑将增强现实技术纳入其应用程序蓝图。 AR已经展示了巨大的潜力,特别是通过实现高端3D游戏体验。 […]

Xcode和CI中的秘密变量可带来乐趣和收益💌

让我们以一个小小的事实作为本文的开头: 您的代码存储库中永远不应包含任何敏感信息。 没有 例外 。 API密钥,密码,您的电子邮件(包括集成测试之类的内容)。 这确实是不好的做法,但几乎每个人都这样做。 甚至我上班的回购中仍然有电子邮件或其他内容。 这个问题非常普遍,GitHub上有官方指南可以从存储库中删除敏感信息。 GitHub上还有300k +提交仅删除密码(这是无效的,但\\(())_ /¯)。 这个问题如此猖,,有许多著名的开源项目致力于解决这个问题。 既然我们已经概述了问题,那么我们需要设计一个既安全又容易的解决方案。 我认为让“错事难”和“正确事”变得简单同样重要。 这将使开发人员(也就是您和我👋)将秘密密钥用于分析,库,集成测试等。所有这些都不会破坏我们的工作流程(我们仍然希望能够按⌘+ R / B / U,并使用现有的工作流程。) 灵感 事实证明,商业CI提供者已对此问题提供了不错的解决方案(💯为BuddyBuild上令人惊叹的人们提供了思考的💯🙌) 大多数CI提供程序都有一种存储加密变量(buddybuild:和travis)的方法,这些变量是父进程环境变量的一部分。 不过有两个问题: 您如何在本地使用这些🤔? 如何在Xcode中访问环境变量? 为了弄清楚这一点,我查看了我的同事的设置(他们通常使用CLI而不是IDE进行工作)。 他们的本地设置通常涉及一个名为`env-vars.sh`的bash脚本(位于他们的.gitignore中)。 看起来像这样: 太棒了 现在,我们可以在构建阶段添加构建阶段(“运行脚本”)。 注意,您需要在“编译源”步骤之前添加此代码。 这是因为我们需要添加一个新的.swift文件来编译和获取我们的环境脚本(如果存在)并运行Sourcery。 我们需要在项目中添加`.stencil`模板文件,并向Sourcery提供它的父目录,这样它才能发挥作用。 这是脚本(用于⌘+ C’ing): 现在,运行一次⌘+ B,以生成源文件。 (不用担心您的构建是否失败。这是因为我们尚未添加生成的文件)。 它的扩展名为`.genic.swift`。 将其添加到您的项目中,现在您将可以从源代码inside内部访问这些变量。 PS:请注意,您必须在.gitignore中添加`.generation.swift`,以便您的凭据不会意外地出现在您的仓库po中。 现在,您可以无缝地,轻松地使用我们先前声明的`testCreds`结构,而不必担心CI或开发机🎉中的实现细节。 并且您当前的工作流程不受影响(⌘+ R / B / U仍然有效🎊) 感谢您阅读我的文章! 如果您有任何疑问,请随时在Twitter上与我联系(大多数情况下我都是@codeOfRobin)或询问中型评论。 PPS:我将很快与Abheyraj Singh一起研究一些非常酷的东西。 敬请关注!

回到学校-通过ASO技巧回到基础知识,这将使您获得更多的荣誉

我们已经在App Store中搜索了诸如健身日记之类的特定关键字,并收到以下选项: 查看这些健身日记图标时会想到什么? 您猜对了,这些开发人员似乎对此表示怀疑。 在这种情况下,蓝色的《饮食观察家日记》倾向于更加突出。 当您创建图标时,研究竞争对手并查看其中的内容,假设您是应用程序的未来用户,那么您想在其他应用程序上点击自己的应用程序是什么? 通过以下方式使图标发光: 与众不同 使其弹出 不过度使用颜色 保持清洁和简单 投资您的设计并创造出真正独特的东西。 查看iOS图标库,了解图标设计灵感。 本地化就像ABC一样容易 这可能会让人感到震惊,但并非所有的应用程序用户都是英语使用者。 实际上,根据App Annie的说法,“在下载量和收入排名前10位的国家中,有50%是来自欧洲和东亚的非英语国家。”因此,基本上,您有大量的潜力可能未得到最大利用。 App Store可以实现列表的本地化,开始细分受众群体并投入一些时间来创建专门针对特定语言和位置的内容和图形。 不要忘记,每个翻译都在搜索引擎中建立了索引,并且有可能在目标国家/地区内和境外产生结果。 Moburst副总裁Or Tamir表示: “本地化不仅与翻译有关,还在于了解下一个市场将是什么以及如何最好地渗透其中 。” 他建议构建一个本机应用程序页面,该页面重点关注以下因素: 与位置相关的特定关键字 用户行为 地域差异 文化差异 本地化是一个简单但重要的概念,如果您在法国的广告使用法语与受众群体交流。 以自己的语言与客户交流可以增加应用发现的机会以及转化率。 透过独特的萤幕快照,一窥您的应用程式 应用程序商店的屏幕截图对于将应用程序页面浏览量转换为下载量具有巨大影响。 屏幕截图非常重要,因为它们为您的潜在客户提供了一个机会,使他们可以在下载应用之前直观了解您的应用。 在App Store中,您最多可以上传5个屏幕截图。 将必要的资源投资到您的屏幕截图中,并确保它们包含能吸引您的客户的详细信息。 您可以在图形中使用文本来展示新功能或强调要展示的重要特征。 尝试提供客户在下载应用程序时将获得的体验。 例如,《战争游戏-射击时代》提供了一些截图,这些截图描述了应用程序的使用体验,还描述了应用程序本身的特征。 带有或不带有文本完全取决于您,但是请确保您的屏幕截图显示最令人激动的功能或最新的更新。 建议: 跳出框框思考-标准设计无法解决问题 使用人脸或手等人为元素 展示您的USP 创建描述某些动作的屏幕截图 让客户偷窥您令人兴奋的应用程序 A / B测试对于检查性能最佳的屏幕截图至关重要 高于平均水平 您不必天才就能理解ASO的重要性,但是如果您想将自己的应用与其他应用分开并排在前十位,则必须要高于平均水平。 有时最好的策略是回到基础上,回顾并继续尝试新事物。 因此,闻一口隐喻的铅笔,准备秋天,这是您重新开始的机会。 这篇文章首先出现在Appnext博客上 […]

MVVM和反应式的味道–无瑕的应用故事–中

最初于 2018年8月16日 发布在 faultlessapp.io 博客上。 MVVM和反应式范例 我喜欢Swift,就像其他许多面向对象的编程语言一样。 Swift使您可以表示具有某些特征并可以执行某些操作的现实世界对象。 我倾向于将应用程序视为每个对象都是一个人的世界。 他们工作和沟通。 如果一个人不能独自完成工作,则需要寻求帮助。 以一个项目为例,如果经理必须独自完成所有工作,他就会发疯。 因此,需要组织和委派任务,并且需要许多人在项目上进行协作:设计师,测试人员,Scrum管理员,开发人员。 任务完成后,需要通知经理。 这可能不是一个好例子。 但是至少您了解OOP中进行通信和委派的重要性。 当我开始iOS编程时,我对“体系结构”一词很感兴趣。 但是经过一段时间后,一切都归结为确定和划分职责。 本文介绍了有关MVC和对MVVM的简单提取类重构的知识,以及如何使用Rx进行进一步开发。 您可以自由地创建自己的体系结构,但是无论您做什么,保持一致性都是避免混淆或使团队成员感到惊讶的关键。 模型视图控制器 看一下您最了解的MVC架构,它是Model View Controller的缩写。 创建新的iOS项目时,您总能得到一个。 View是您使用UIView , UIButton和UILabel 。 模型只是数据的幻想。 它可以是您的实体,网络中的数据,数据库中的对象或高速缓存中的对象。 控制器是在模型和视图之间中介的事物。 UIViewController是宇宙的中心 ViewController的问题在于它往往很大。 苹果将​​其作为宇宙的中心,在那里它具有许多特性和责任。 您只能使用UIViewController做很多事情。 与情节提要板进行交互,管理视图,配置视图旋转,状态还原等操作。 UIViewController设计有很多挂钩,供您覆盖和自定义。 看一下UIViewController文档中的许多部分,如果没有UIViewController ,您将无法执行以下操作。 func viewDidLoad() var preferredStatusBarStyle: UIStatusBarStyle { get } UITableViewDataSource var presentationController: UIPresentationController? { get } […]

iOS中的列表适配器-第3节

在之前的文章中,我创建了简单的适配器 和具有许多不同单元的复杂适配器 。 现在,我想更进一步,创建可以包含许多部分的适配器。 为此,我必须为表部分再创建一个协议

Каждому视图повсплывающемуменю

Всегдаприятно,когдавприложениипродуманымелочи。 Однимизтакихнебаловажныхэлементовинтерфейсаявляетсявсплывающееменю UIMenuController中的UIMenuController 。 Вэтойстатьемыразберемся,какработатьсовсплывающимменю,скакимиограниченияеиин Собираемэлементыменю Итак,мысобираемсяпоказатьвсплывающиеменюдлянекоторогоUIView。 Дляначалаопределимся,какиеименноэлементыбудетпредлагатьнашеменюпользователю。 UIItemView 。 Черезнеговконтроллерменюпередаетсяотображаемыйтекстидействие,происходящеепривабе let item = UIMenuItem(title:“ Send”,action: #selector (sendTapped)) Рассмотримпоподробнеевторойпараметр— action 。 Окей,этоселекторнекоторогометода,которыйбудетвызванпривыбореэлементаменю。 Значит,этотметоддолженбытьгде-тореализован,ногдеименно? Еслибыэтобылаобычнаякнопка,тополучателяможноуказатьвметодеaddTarget: sendButton.addTraget( self ,action: #selector (sendTapped),for:…) 在UIMenuItem上添加UIMenuItem 。 Кудажетогдаотправится action ? Обратимсякдокументации: 未指定目标; 通过响应者链的正常遍历找到合适的目标。 响应链 ? Похоже,преждечемдвигатьсядальше,нампридетсянемногоразобратьсявпроцессеобработиисобы。 响应者链иfirstResponder UIResponder ,UIUI应用程序,UI控制器中的Любоеприложениеможнопредставитьввидеиерархииобъектовкласса Каждыйтакойобъектспособенполучатьсобытия:нажатия, 运动 -событияили UIControlEvents ,илибообрабатыватьполученноесобытие,либопередаватьегоследующему 应答 “увиерархии。 响应者 Но,преждечемпопасть,событиедолжнобытьполученокем-товпервуюочередь。 ПоэтомудлякаждоговприложениисобытияUIKitопределяетнаиболееподходящийобъектклас firstfirstResponder’омтотобъектстановится 响应者, […]

自动版面

自动版式会根据对这些视图施加的约束来动态计算视图层次结构中所有视图的大小和位置。 例如,您可以限制按钮的位置,使其在“图像”视图中水平居中,并且按钮的顶部边缘始终保持在图像底部下方8个点。 如果图像视图的大小或位置发生更改,则按钮的位置会自动调整以匹配。 这种基于约束的设计方法使您可以构建可动态响应内部和外部更改的用户界面。 当超级视图的大小或形状发生更改时,将发生外部更改。 每次更改后,您都必须更新视图层次结构的布局,以最佳利用可用空间。 以下是一些外部变化的常见来源: 用户调整窗口大小(OS X)。 用户进入或离开iPad(iOS)上的拆分视图。 设备旋转(iOS)。 活动的呼叫和录音栏会出现或消失(iOS)。 您要支持不同的尺寸等级。 您要支持不同的屏幕尺寸。 这些更改大多数可以在运行时发生,并且需要您的应用程序动态响应。 其他功能,例如对不同屏幕尺寸的支持,则表示该应用程序可以适应不同的环境。 即使屏幕大小通常在运行时不会改变,创建自适应界面也可以使您的应用在iPhone 4S,iPhone 6 Plus甚至iPad上同样良好地运行。 自动布局也是支持iPad上的“滑行视图”和“拆分视图”的关键组件。 当用户界面中的视图或控件的大小更改时,就会发生内部更改。 以下是内部变更的一些常见来源: 应用程序显示的内容发生更改。 该应用程序支持国际化。 该应用程序支持动态类型(iOS)。 当您的应用程序的内容更改时,新内容可能需要与旧内容不同的布局。 这通常发生在显示文本或图像的应用程序中。 例如,新闻应用程序需要根据各个新闻文章的大小来调整其布局。 同样,照片拼贴必须处理各种图像尺寸和宽高比。 国际化是使您的应用程序能够适应不同语言,地区和文化的过程。 国际化应用程序的布局必须考虑到这些差异,并在应用程序支持的所有语言和区域中正确显示。 国际化对布局有三个主要影响。 首先,当您将用户界面翻译成其他语言时,标签需要占用不同的空间。 例如,德语通常比英语需要更多的空间。 日语经常需要更少的东西。 其次,即使语言不变,用于表示日期和数字的格式也可能因地区而异。 尽管这些更改通常比语言更改更微妙,但用户界面仍然需要适应大小上的细微变化。 第三,更改语言不仅会影响文本的大小,还会影响布局的组织。 不同的语言使用不同的布局方向。 例如,英语使用从左到右的布局方向,阿拉伯语和希伯来语使用从右到左的布局方向。 通常,用户界面元素的顺序应与布局方向匹配。 如果按钮在英语视图的右下角,则应该在阿拉伯语的左下角。 最后,如果您的iOS应用支持动态类型,则用户可以更改应用中使用的字体大小。 这可以更改用户界面中任何文本元素的高度和宽度。 如果用户在应用程序运行时更改字体大小,则字体和布局都必须适应。 布局用户界面的主要方法有三种。 您可以以编程方式对用户界面进行布局,可以使用自动调整大小的遮罩来自动执行对外部更改的某些响应,或者可以使用“自动布局”。 传统上,应用通过以编程方式为视图层次结构中的每个视图设置框架来布局用户界面。 该框架在超级视图的坐标系中定义了视图的原点,高度和宽度。 要布置用户界面,必须计算视图层次结构中每个视图的大小和位置。 然后,如果发生更改,则必须为所有受影响的视图重新计算框架。 在许多方面,以编程方式定义视图的框架提供了最大的灵活性和功能。 发生更改时,您可以按需进行任何更改。 但是,由于还必须自己管理所有更改,因此,设计一个简单的用户界面需要花费大量的精力进行设计,调试和维护。 […]

Swift 4中的iOS UIKit:将MenuItem添加到UIMenuController

预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIMenuController https://developer.apple.com/reference/uikit/uimenucontroller UIMenuItem https://developer.apple.com/reference/uikit/uimenuitem 快乐编码😄