存储库自述文件对我总是很满意。 它们都有不同的风格,包括图像,GIF,徽章,链接等。它们不仅可以看上去,而且可以传达有关该项目进行中的大量信息,并且可以吸引人们的注意力。 可悲的是,我们大多数人,至少在项目开始时,没有浪费时间使我们的回购自述文件大放异彩。 今天,我将向大家展示适合您的回购交易的简便程度,使其看起来比以往更加专业。 免责声明:**这 如果圣诞节和新年前夕之间的一周内上线,则发布。 因此,尽管我可以做一些需要更少时间的事情,但仍然很重要。 继续阅读以了解如何使您的仓库回升。 在..之前很伤心.. =( 您可以在屏幕快照中看到我的Marvels App博客文章存储库的外观。 没有真正的吸引力。 对我而言,这仅是在提醒人们机会不足。 分享有关我的项目和目标的更多信息的机会。 **如果您尚未查看marvel的应用博客文章系列,则可以在这里进行。 您会发现许多有趣的内容,内容涉及如何使用许多不同的pod和工具从头开始创建应用程序,从而使您的生活更轻松。 给我看看更好的.. !! 本自述文件中有几件事正在进行,因此让我介绍一下: 现在它具有徽章,在顶部显示相关信息 它具有锚点导航,允许读者跳至特定部分。 它有一个屏幕截图,显示了应用程序流程以及用户对项目的期望。 它有一个动机部分,回答一些问题,例如: 这是什么? 我为什么要在乎呢? 它与他人有何不同? 这个存储库的目标是什么 ? 它具有发布链接,将链接带到页面。 它具有安装和测试部分,提供有关如何运行这些步骤的说明。 最后但并非最不重要的一个许可证部分,显示代码的可用性 。 这可以像您认为的那样广泛。 您可以使用一些您喜欢的开源项目作为自己存储库的灵感源。 *您可以在这里查看 github上的页面。 自述文件的资源.. 在下面,您可以找到一些资源,这些资源可以在上面提到的仓库转换过程中提供帮助。 去看一下! shields.io是一个了不起的工具。 它允许您粘贴存储库URL,并可以根据您的回购文件推荐徽章。 Shields.io:开源项目的质量元数据徽章 我们提供快速且可扩展的信息图像,作为GitHub,Travis CI,Jenkins,WordPress等的徽章。 Codecov和工作服可以将您的代码覆盖率百分比显示为自定义徽章。 太棒了!! 连续代码覆盖率 连续代码覆盖率。 托管覆盖率报告与GitHub,Bitbucket和GitLab高度集成。 浏览器… codecov.io 工作服 修改说明 coveralls.zendesk.com […]
“在计算机科学中, 数据结构是在计算机中组织数据以便有效利用的一种特殊方式。”-维基百科 这些数据结构和设计模式使您可以通过简单且普遍有用的解决方案来摆脱臭名昭著的反模式 。 输入SwiftyAnimate(插件🔌)。 制作动画的更好方法…… 您是否尝试过将多个动画串在一起? 是的,你当然有。 您将每个后续动画包装在上一个动画的完成处理程序中,并迅速结束编写其他功能的工作,以打破厄运金字塔(或死亡虫洞?)。 无论您最终得到什么,都不是您真正想要的。 也许像这样……? 输入要救援的队列! 它们为您提供O(1)入队和出队的时间复杂度,而您在Swift中使用标准Array类型无法获得(阵列对append和popLast操作具有O(1)的平均时间复杂度,其中popFirst是O(n)操作)。 (现实生活中的例子)
起始时间 自上次更新以来,发生了很多事情,我们想向您介绍我们的进展。 首先,让我告诉您更多有关我们的身份以及我们这样做的原因。 我和Alex五年前在SaaS产品上一起工作,并且在那时也成为好朋友。 Alex为生活设计产品时,我是一名软件开发人员。 在过去的几年中,我一直在为iOS开发,并在此之前使用Node.js和C ++。 我认为,无论使用哪种语言,开发人员工具都是日常工作中令人沮丧的一部分。 我希望您喜欢Xcode,但是……令人困惑的是,我们开发人员没有花足够的时间来使我们的工具更锋利,因为从长远来看,即使工具效率提高5%,也可以节省大量资金。 尽管创建了如此多的编程语言并发布了这些语言的库,但是整个开发过程仍然受到早期计算的启发,当时唯一的输入方法是文本。 看来,对其进行现代化的努力还不够集中和不够完善。 想出一个主意 当Swift宣布具有许多当时被认为是“学术性”语言的功能时,我对它印象深刻。 开源Swift使我们更接近成为全栈开发人员,并将其带入所有其他生态系统。 在那个时候,我围绕着开发人员工具研究自己的一些想法。 如果我们拥有GitHub,但对于iPad上的Swift Playgrounds,又能够轻松地在操场上共享代码,跟随其他人和他们在Swift上的经验,该怎么办? 如果您可以花最少的精力在云中运行Swift代码而不用担心服务器和可伸缩性怎么办? 所有这些都可能是个好主意,我很乐意看到有一天将它们付诸实践🙂 这使我对在Linux上运行具有很多潜在潜力的Swift产生了兴趣。 除了能够为多个平台编写代码之外,Swift本身在这个领域中处于有利地位,唯一可比较的语言是Rust和Go。 Swift在其生成的可执行代码中在可读性/简单性和CPU / RAM占用空间之间取得了良好的平衡。 这方面存在信息空白,我试图填补七月份发布的时事通讯。 订阅者的数量(每周增长5-10%)和内容量证明了我的假设。 非常感谢我们的读者以及所有为服务器端Swift生态系统做出贡献的人们,没有您,这个新闻通讯将无法实现! 这使我确信,可以在生态系统增长的早期阶段对开发人员工具产生最佳影响。 好像我找到了一个合适的人选。 从简单的事情开始是合理的,应用程序监视和检测似乎是一个不错的选择。 事实证明,对于Linux上的Swift,在这方面没有做太多事情。 亚历克斯喜欢这个主意,我们想证明确实有此需要。 验证想法 在将近一个月前启动了Astrocat的目标网页后,我们已经对这件事产生了浓厚的兴趣。 令我们惊讶的是,有多少人已经在生产中使用Swift,而提高后端稳定性和性能的工具将大有帮助。 我们看到了对崩溃报告和仪表工具的明确需求,并对未来产品有了清晰的愿景。 Astrocat的第一个版本将是一个集成在后端中的库,该库会将崩溃和错误报告发送到我们的服务器或本地托管的服务器。 基于这些事件,它通过电子邮件,Slack集成,推送通知等向您发送通知。
简介Shallows —可重用,易于使用的缓存库 我认为您会同意,有时候在iOS中,本来应该很容易的事情变得很困难。 好吧, 不难 ,但是麻烦,不直观,而且绝对没有乐趣。 良好的例子之一是轻量级的持久性。 也许您想在磁盘上保存少量用户数据。 或缓存一些来自网络的信息。 甚至存储图像。 您知道这些事情很容易实现,但您却并非如此。 因为这些事情很棘手。 您将要编写很多代码( LightweightPersistenceManager ,还有其他人吗?),并且有很多事情您可能做错了,而且您的解决方案可能不会那么好或不能重复使用。 那不是你的错 只是在iOS上,轻量级持久性没有自己的抽象级别。 系统解决方案缺乏统一性,灵活性,并且往往向我们公开许多实现细节,有时会使依赖于此的代码不可测试。 Shallows的目标是提供缺少的抽象级别。 首先,这是GitHub存储库的链接: 德雷蒙德/浅滩 浅浅–🛶您的轻量级缓存工具箱 github.com 现在让我们开始吧。 抽象 认识Storage -在Shallows的轻量级持久性世界中,您的主要朋友。 Storage实例是完全抽象的-除键和值的类型外,它们不公开任何实现细节。 存储器可以执行“获取”和“设置”操作,这些操作都是易错且异步的。 让我们看看它们: storage.retrieve(forKey:“ batman”){(结果)在 切换结果{ case .success(让值): //用值做某事 案例。失败(让错误): //处理错误 } } storage.set(gordonImage,forKey:“ gordon”){(结果)在 如果result.isSuccess { //成功设置 } } 我们如何获得一个Storage实例? Storage对象是经过类型擦除的,它们实际上不包含任何逻辑。 但是Shallows提供了以下存储: MemoryStorage NSCacheStorage DiskStorage ,它是一个Storage 最后一个可能是最有趣的。 […]
自苹果推出Swift以来已经两年了。 在最初的12个月中,我很犹豫地推荐Swift作为一种实现语言。 实际上,我认为我的确切话是“不”。 在Swift大一的时候,这些工具不稳定,语言和库还很不成熟。 但是,在过去的12个月中,语言在不断发展壮大。 苹果公司开源了Swift,并通过Swift.org向更广泛的社区开放了该语言的发展。 这鼓励了社区通过Swift Evolution流程对Swift做出的巨大贡献,而即将发布的Swift 3也从这些努力中取得了成果。 Swift 3带来了该语言在其短生命周期中所看到的最重大的变化。 Swift 3和“伟大的重命名” Swift 3带来的最重大更改可能是“ The Great Renaming”。 去年这一年,Swift Evolution Process提出了许多建议,以澄清和标准化Swift标准库的命名方案,以及Swift如何导入Apple现有的框架(如Foundation,UIKit和Core Graphics)。 这产生了“ Swift API设计指南”。 这个新的命名标准意味着在使用这些框架时,Swift 3将与Swift 2完全不同。 随着向Swift 3的迁移,几乎所有现有的Swift代码都将需要迁移到新的命名标准并遵循这些准则。 Xcode 8包含一个迁移工具来帮助完成此过渡。 工具很棒,但是就像大多数工具一样,它可以节省您的工作,而不是从过程中消除所有想法。 我认为,所有Swift应用程序代码仍将需要由人工迁移来审核和审查。 此外,迁移工具无法帮助您将现有的应用程序代码转换为新的API准则。 它仅解决您的代码如何与Apple框架交互以及该API的更改方式。 Swift 3和ABI稳定性 Swift 3的目标之一是ABI稳定性。 这没有发生。 这意味着为了将项目升级到Swift 3,该项目的所有Swift依赖项也都需要更新到Swift3。不可能将Swift 3应用程序与Swift 2库链接。 在接下来的12个月中的某个时候,Swift 3很有可能达到ABI的稳定性,而在今年的WWDC上,克里斯·拉特纳(Chris Lattner)表示,在考虑日后对语言的更改时,保持源代码兼容性将是一个强大的约束。 因此,希望明年不再需要“ Great Renaming 2”。 何时切换到Swift 3? 团队现在应该开始为此进行计划。 […]
我一直希望并有一段时间为开放源代码社区做出贡献,部分原因是我的大部分工作基于免费工具,并且免费共享给我,我很感激。 但是主要原因是我很少从事有意义的软件工作。 我的意思是,如果您从蓝色大理石的角度看待这个世界,那么帮助一些公司出售更多产品并不是您的目标,甚至不是目标。 该应用程序的Open Sourcing部分使您感觉自己在处理比出售更多东西的应用程序还要大,有用且…好。 将组件分离,将软件与可重用和通用模块组合在一起只是好的设计,如果这些部分经过了实战测试并且质量很高,为什么不与所有人共享它? 我怀疑你们每个人都想与所有人共享一些简洁的代码。 我知道这对我们许多人来说都是显而易见的,但是-在这里相信我-并非所有人。 为什么是微型图书馆? 专注和做一件事情的能力 单一(简单)责任 较小的精力准备发布 (很多)更容易维护 挑战(为什么不经常这样做?) 老实说,作为工程师,我很少经常考虑法律。 那并不意味着我不知道著作权法。 当您将工作中的工作开源时,您必须征求所有者(您的老板,客户等)的批准。 有时很难,人们(尤其是企业类型)会提出一些异议。 有些是有效的(客户不会理解什么是开源),有些是纯BS,例如“现在有人可以免费制作我的应用吗?”。 在开始进行项目之前,这要容易得多。 您应该说或最好写这样的电子邮件: “在制作软件的过程中,我可能会确定一个或多个组件可以成为开放源代码库的候选对象,我可以在自己的私人时间内发布它,然后将其用作外部依赖项。 我花在此功能上的计费时间不会增加,但是您可能希望代码和软件质量更好。” 最终客户应了解并获得您的同意-带有批准的电子邮件回复就足够了。 有时,您将不得不解释什么是开放源代码,并且别忘了提到您使用的普通应用程序中有多少百分比基于开放源代码。 🌃失眠 https://github.com/ochococo/失眠 如何防止屏幕锁定我的应用程序? 这个想法很简单,如果您忽略.disabled ,则有三种模式以及两种模式: always -只要一个Insomnia实例在内存中,iOS就不会超时也不会消失 whenCharging —如果设备连接到电源,失眠的行为将类似于always模式。 用法示例: 最后一个类AppDelegate:UIApplicationDelegate { 私人让失眠=失眠(模式:.whenCharging) } 下一版本功能? 除了模式之外,我想称其为Rule -当设备电源状况发生变化时调用闭包。 将提供一些预定义规则,以使其更易于使用该库。 学分 Artur Martynowski失眠的标志设计—检查他的运球资料,他真的很棒!
本文应该是很久以前写的,但碰巧的是,当您玩得开心时光飞逝。 我的前同事约翰·桑德尔(John Sundell)去年(2017年)进行了一场路演,但他一直在质疑我们如何进行开源并为此获得报酬。 现在是时候揭开秘诀了。 它可能不像您想的那样秘密。 开源是我非常关心的事情,实际上,我在2017年Mobil时代谈到了这一点。 一切如何开始 在加入公司之前,Hyper的开源就开始了。 它基于这样一个简单的前提:如果我们要使用开放源代码,那么我们也应该做出贡献,通过帮助现有项目或在Hyper的保护下创建新的开放源代码。 害怕做开源 当我申请Hyper职位时,我会给你一个秘密,我从来没有做过iOS应用程序,反正做得不好。 哎呀,我什至不知道使用表视图时出队,更不用说我曾经公开发布过任何代码了。 我输入了一个全新的域。 但是,我确实有OS X开发方面的业余经验。 数周以来,我感到害怕,因为我被贴上欺诈的标签,比进入后的轿车门缩回更快,被赶出了公司。 对我来说幸运的是,Hyper是一个超级办公的好地方,其核心是协作和知识共享。 我很快学会了正确地完成工作所必须要做的事情,但是我仍然有一个很大的恐惧,那就是公开地与公司的核心价值发生冲突,这就是对开源的恐惧。 我不能全神贯注于会带来什么,我只是将其视为发现我作为蛇油推销员的另一种方式。 进行开放源代码开发的领先者是Web团队,他们在Ruby on Rails上投入了大量资金,并生产了与社区自然共享的出色宝石。 碰巧,我为Hyper发布的第一个开源软件是一个名为singleton-rails的红宝石,我的同事Tim Kurvers承担了繁重的工作,我或多或少只是将其推到rubygems.org。 即使在这种情况下,我仍然很害怕在公开场合露面我的名字。 早在2014年,“过去”就被吓呆了。 如果我可以放心,我会拥抱他,告诉他一切都会好起来的。 说明开放源代码无所畏惧,但值得拥抱,美好时光已经来临。 然后,我将摘下他的锡箔帽子,称赞他的头发。 “宇宙不会围绕你旋转!” —将来我给过去的我一些建议 我知道很多人对此感到害怕,当这样的事情出现在Twitter上时,谁能责怪他们。 我知道作者对该推文没有害处,但很快就升级为在线嘲讽。 我什至为在Slack上开个玩笑而感到内,,因为它缺乏排序对我的OCD造成了伤害。 但是,即使我的评论是私人的,我也应该知道得更多。 如果这确实使我感到困扰,那么我本可以进行PR来纠正问题,而不是取笑别人的源代码。 我当然不希望任何人对我这样做,如果他们在我的代码中找到了任何恶作剧,我很希望PR来解决。 如何开始 在Objective-C和Swift过渡期间,我们的团队完成了迄今为止最大的项目之一。 一个明显的问题暴露出来,我们选择哪种语言。 我们对此进行了许多回合,来回跳动,弹出了不同的论点,这些论点被无效和纠正。 最终,我们登陆了Swift。 这给了我们在社区中编写纯Swift框架的独特位置,这在当时是一个真正的热门话题。 我们是由四个开发人员负责该项目的,因此决定将项目拆分为不同的功能,并为应用程序的每个部分组成微型团队。 每个功能都有自己的规范,我们共同检查了所有这些规范,并一致决定可以将哪些部分提取到框架中。 通常会导致规模扩大的两个主要原因,第一个是“我们能否在其他应用程序中利用此功能”这个问题的结果,另一个是:“如果这是它自己的组件,它将加快开发速度。”
每个iOS应用程序都有一个关联的容器,作为开发人员,您可以在其中基本上存储所需的任何内容。 这通常称为“沙盒”。 在此沙箱中,您可以放置用于不同目的的文件-它可以是用户可见的文档,数据库文件,缓存或某种元数据-任何东西。 基本上,iOS上的所有持久性技术都使用应用程序的容器在其中存储信息。 因此,了解应用程序文件夹的外观,结构以及放置在其中的文件对于每个iOS开发人员都是至关重要的。 但是,这里存在问题: 不幸的是,对于每个iOS应用程序都至关重要的概念,Apple并未对其API进行过多考虑 因此,例如,如果您需要获取应用程序的“ Documents”文件夹URL,则需要编写以下代码: let urls = FileManager.default.urls(for:.documentDirectory,in:.userDomainMask) 让documentsURL = urls [0] 如果您确切知道该代码在做什么,那可能看起来还不错。 但是对于不习惯此API的人来说,它看起来也很恐怖。 因为当您尝试使用自动完成功能来发现您的选项时,会得到以下信息: 在这种情况下,有人会怀疑“这里到底发生了什么?”。 .adminApplicationDirectory ? .applicationScriptsDirectory ? .moviesDirectory , .trashDirectory吗? 有很多东西,其中大多数对于iOS应用程序绝对没有任何意义 。 然后是搜索路径域掩码: …嗯, 是的,我确切知道该选择哪一个。 这个API对于macOS可以说是合理的,但是在iOS上,这显然是令人误解的: cachesDirectory放置在musicDirectory和desktopDirectory (显然,这不仅对每个设备而言都是唯一的,而且对于iOS而言也是荒谬的)。 由于某种原因,“ Documents / ”目录表示为.documentDirectory (单数),这可能使您质疑是否选择了正确的文件夹。 它返回一个URL 数组 (可以有多个URL吗?可以没有一个吗?谁知道。) 最后,使用此API,您几乎不了解文件夹在磁盘上的实际结构。 尚不清楚此巨型列表中的哪个文件夹甚至存在,哪些不存在。 我们可以做得更好 好吧,想象一下我们是否可以交易上面的代码 let urls = FileManager.default.urls(for:.documentDirectory,in:.userDomainMask) 让documentsURL = urls […]
“ iOSSnapshotTestCase” FBSSnapshotTestCase教程库Facebook脚本库uber ตัว快照测试用例มันเอาไว้ 快照快照方法renderInContext: UIView对象CALayer对象存储库(参考图像)源代码存储库中的源代码文档显示失败。 ราะ codeอเราเขียน代码ที่เกี่ยวข้องกับUIเยอะมากๆายกรณีทดสอบ(测试用例)ที่เราต้องทำเมื่อสร้าง UIView แล้ว… textราจะรู้ได้อย่างไรว่าตัวอักษร(文本)ที่ใส่เข้าไปเพียงพอในพื้นที่ที่เตรที่ที่เตยมไว้ิ่งโด ดีกับราจะรู้ได้อย่างไรว่ารูปที่เตรียมไว้พอดีกับ图像视图ที่มีให้ Viewราจะรู้ได้อย่างไรว่าสีหรือภาพของ UIView เป็นอย่างไรถ้า状态เปลี่ยนเช่น被选中,突出显示 codeาเราต้องเขียน代码iOSiOS快照测试案例ี่แหละจะมนี่แหละจะมนอน iOSSnapshotTestCase อาสามาถทำได้ Coารติดตั้งผ่านCocoaPods ให้เพิ่ม代码ในกล่องข้างล่างในPodfile target “ชื่อ target (unit) test” do use_frameworks! pod ‘iOSSnapshotTestCase’ end Objectiveาใช้ภาษา Objective-C ให้ใช้ iOSSnapshotTestCase/Core แทนซึ่งจะตัดในส่วนการรองรับภาษา Swift ออกไป อย่าลืมเปลี่ยนชื่อ目标测试นะครับ 2.บอกที่เก็บของไฟล์รูปซึ่งสามารถทำได้3แต่แนะนำให้เพิ่มเข้าไปที่schemaทั้งนี้สามารถกำหนดได้กำหนด2ปลายคือต้นฉบับ FB_REFERENCE_IMAGE_DIR ที่เก็บถ้ามีค่าไม่ตรไม่ตามฉบับ IMAGE_DIFF_DIR สร้างกรณีทดสอบแรก งไฟล์ร้างไฟล์单元测试ที่อยู่ภายใต้目标ของ单元测试โดยให้子类ตัว FBSnapshotTestCase แทนตัว XCTestCase กใช้ FBSnapshotVerifyView ยกใช้方法FBSnapshotVerifyView ในการทดสอบ recordา recordMode = true […]
“从CI获得的构建数量让我们有点不知所措。 我们安装了很多版本,过了一会儿我们不太确定我们当前在设备上安装了哪个版本。 您可以在应用程序中的某个位置添加版本并生成编号吗?” 我将永远记得在nomtek的那一刻,我们的一名测试员告诉我这个问题。 那是一个大项目的开始,所以我知道迅速解决它会在将来对他们有很大帮助。 当然,这没什么大不了的,有很多方法可以实现:咨询设计师后,可以将其添加到一个屏幕中,将其添加到“设置捆绑包”甚至是应用程序图标中。 暂时,我们将其添加到了应用主屏幕上的标签之一。 但是,在此之前,我问了一个使一切与众不同的问题:“ Android团队的朋友如何解决这个问题?”。 事实证明,他们使用的库使他们可以轻松访问许多调试工具。 您只需在屏幕上向左滑动即可显示菜单。 我真的很喜欢这个主意。 我立即开始搜索现有的库,这将有助于在iOS上实现类似的功能。 令我惊讶的是,我找不到任何类似的东西。 我一直对开放源码着迷。 当时我正在等待一个值得花些空闲时间来思考的想法,所以我很兴奋并且有动力开始在自己的图书馆工作。 当我回到家时,我打开了一个空文档,并开始写下我想在那里看到的所有功能。 在许多漫长的夜晚之后,我发布了DBDebugToolkit的第一个版本。 我的目标是提供尽可能多的有用功能,同时保持安装过程的顺利。 本文将研究DBDebugToolkit可以帮助您解决的iOS开发中常见的三个常见问题。 使用服务器 如今,绝大多数应用程序都依赖于服务器提供的数据。 通常情况下,核心业务逻辑是远程执行的,但有时在测试中可以忽略它,部分原因是后端API调用的异步特性。 此外,如果服务器端与您的应用程序同时开发,则应为一些初始问题做好准备。 DBDebugToolkit提供了您的应用程序执行的所有HTTP请求的列表,甚至包括尚未收到响应的HTTP请求。 如果响应中包含图像,则可以看到持续时间,HTTP代码甚至是缩略图。 还可以过滤列表以仅包含URL中具有指定子字符串的请求。 每个请求都可以进行彻底检查。 您可以看到所有HTTP标头和主体详细信息。 正文详细信息屏幕支持文本和图像。 如果请求以错误结尾,您还将看到所有详细信息。 作为经常使用DBDebugToolkit的人,我认为请求列表是最有用的功能之一。 它使我更仔细地了解了应用程序中至关重要但又隐藏的部分,节省了检查后端API文档所需的时间,甚至还帮助发现了琐碎的问题,例如两次发送请求。 有很多工具可以向您显示应用程序发送的请求,例如Charles Proxy。 使用DBDebugToolkit进行网络调试的独特之处在于始终启用它。 当您最终重现您担心的错误并意识到即使没有连接调试器或未启用代理时,也已经为您记录了所有请求,您一定会感激不尽。 此外,一旦从服务器获取数据,DBDebugToolkit可以帮助您验证数据到底发生了什么。 它允许您浏览文件,钥匙串, UserDefaults ,Cookie甚至是Core Data。 验证布局 我将永远记住的与DBDebugToolkit有关的另一种情况是我们的设计师Michał问我是否可以帮助他使用我的库时。 设计评审通常是开发过程的一部分,尤其是在您追求像素完美的时候。 但是,在iOS上进行操作比在Android上麻烦得多,在Android上,您可以使用单独的应用在应用顶部绘制网格并查看是否正确对齐。 iOS上的沙箱无法实现。 相反,可以使用DBDebugToolkit将负责绘制网格的代码注入到您的应用程序中。 我必须承认,我感到as愧的是,起初我只是在考虑开发人员和测试人员,而没有意识到iOS环境对设计师也很苛刻。 感谢Michał在(沙)盒子外面思考! DBDebugToolkit允许您在应用程序顶部绘制高度可定制的网格覆盖。 您可以指定覆盖图的大小,不透明度和颜色,以适合应用程序的边距和配色方案。 网格覆盖将在应用程序的开发和设计审查期间为您提供很多帮助。 它背后的故事是我最喜欢的开源方面之一的完美示例-它根据用户的需求而发展。 除了网格覆盖之外,DBDebugToolkit中还包含一项附加功能,在设计审查期间可能会有所帮助。 […]