Tag: iOS应用开发

包装器,用于处理iOS中的字体

大家好,希望你做得很好! 在本教程中,我将引导您完成如何制作包装对象以处理iOS中所有自定义字体的方法。 开始吧… 字型: 字体可以为您的文本增加价值。 它可以帮助读者感知文字信息。 颜色 , 字体和文本大小的正确选择对于吸引目标受众至关重要。 使用印刷版吸引读者很容易,但要吸引他们的注意力需要更多的创造力。 TTF和OTF是扩展名,用于指示文件是字体,可用于格式化文档以进行打印。 TTF代表相对较旧的字体TrueType字体,而OTF代表OpenType Font ,它部分基于TrueType标准。 两者之间的重大区别在于它们的功能。 TTF仅取决于字形表,该字形表定义了每个字符的外观,而OTF能够与CCF(紧凑字体格式)表一起使用字形。 如何在iOS中添加自定义字体: 首先从Web或UIDesigner获取所需的字体文件(TTF或OTF) 将它们移动到您的项目文件夹中(如果需要,请确保复制并选择了目标)。 通过从导航窗格中选择项目根文件夹,然后从目标中选择“构建阶段”,仔细检查字体是否包含在资源包中。 然后展开“ Copy Bundle Resources”行,以查看那里的字体文件。 如果不存在,请在导航器窗格中选择文件,然后将其手动添加到目标中。 打开Info.plist,然后右键单击并选择“添加行”。 开始输入并选择“应用程序提供的字体”。 展开该行,然后在“值”字段中的“项目0”旁边输入字体的名称(包括其类型,例如,参见下图)。 →现在您知道了字体的价值,以及如何向iOS项目添加自定义字体。 现在,让我们编写一个包装对象来处理项目中的字体。 在开发阶段,字体大小或其样式随时可能取决于UI外观。 因此,通过使用该包装器,我们可以轻松处理这些更改,而无需花费大量时间和精力。 让我们编码: →首先,我们创建一个结构以封装所有需要访问的类型,以创建和返回字体 。 我们将枚举用于类型,因为它们在用例中非常方便。 它们也是值类型,因此也不必担心保留周期。 首先创建一个struct对象,定义一个枚举类型以选择或传递所需的Font名称。 此类型根据选择的情况返回一个值,该值是计算属性。 在本教程中,我使用“ SFProDisplay ”和“ SFProText ” 字体 (自定义),并且还提供了一个自定义大小写来访问预定义的系统(自定义)字体。 上面的Font对象不覆盖系统字体。 除系统字体外,您可以使用所有其余字体。 您可以根据需要使用系统API来构造系统字体类型。 如果要覆盖所有类型,请将它们包括在FontType 枚举中 。 如果您想了解有关在iOS中处理字体的更多信息,请检查以下我提供的资源。 目前为止就这样了。 祝您编程愉快,如果您遇到任何更好的资源或方法,请与我分享。 […]

历史上最简单,最奇怪的CoreData简介

CoreData! 是! 没有! 等等…什么? 来自很多地方的很多意见。 什至是什么? iOS中的一些“数据库”东西,可以让您的应用存储东西,对吗? 但是,请等待,不要更改数据模型,否则必须进行迁移。 ?? 让我清楚一点:如果您没有从正确的地方学习,CoreData可能会使在线学习感到困惑。 这篇文章将像您从未见过的那样介绍CoreData:它是如此简单,以至于我的非编程性(但还真是太棒了)的妻子理解了它。 每当您开始使用CoreData时,都需要习惯一些术语和想法。 停。 请允许我为您提供更多乐趣,让它看起来不那么奇怪。 假设您是老板(是的!),您有几个员工。 这是特别忙碌的一天,但是突然有人突然冲进您的办公室,完全没有考虑到您只是在听泰勒·斯威夫特(Taylor Swift)的声音而现在却疯狂地试图隐藏它。 “达娜·斯库利(Dana Skully)刚把咖啡倒在我的全新Mac上!”,她在你的脸上吼叫着,以至于你实际上可以品尝到二手咖啡。 冻结。 眼前的不公正情绪激起了你的情绪。 我的意思是,咖啡从这个女人的脸上滴下来。 那个美丽的苹果电脑全都被破坏和浸泡。 你呢 a)当场射击达娜(最令人高兴) c)思考(大多数甘道夫) 令人震惊的事实是你还不能决定。 您需要一些上下文。 如果您要成为一名好经理,并且我们知道您想成为一名好经理 (您解雇了她,不是吗?),那么您需要了解有关情况的具体情况。 您需要有人回忆起发生了什么情况,以及在什么情况下是一名好经理的描述 (如果您解雇了她,只需责怪侠盗猎车手给您冲动的愤怒,所有的孩子都会这么做)。 我要去哪里? CoreData的工作原理与普通数据库略有不同,并且是一个很好的方法,但是考虑它的最佳方法是使用您创建的某种数据模型(足够简单,也许是新关系的颜色)。 但是,它将这些“联系”存储在上下文中,即托管上下文中 。 我对这种情况的看法是,其中的所有内容都有描述 ,例如涉及Dana Skully的不幸事件,我们稍后会再讲。 实际上,我们数据模型中的这些联系实际上是在您的应用程序中带有描述的,因此所有内容都可以正确存储。 最后一件事是,我忘了提到您是一家销售新Mac的商店的经理,所以每个人都还不错(您后悔解雇Dana)。 CoreData中的所有操作都是通过store完成的,好在这里存储您创建的内容。 应用程序关闭后,他们正等着您,从数据模型中加载,传递到商店并传递到可使用的托管对象上下文中 ! 如果您不感到困惑,那么恭喜您,您现在已经了解到有关CoreData的有用信息。 实际上,这就是我设法记住它的方式。 我做了一个故事。 不要相信那些“仅仅记住”事情的人,总是最好使用一个荒谬的故事,这是所有最优秀的人做事的方式。 那么最后,我们的Dana Skully发生了什么? 好吧,您奇怪地意识到:“达娜(Dana)已经走了……10…年”(乔伊·特里比安尼(Joey Tribianni)对于未成年人的参考)。 幽灵般的。 至少CoreData不会像这样开坏玩笑。

使用Swift Codable进行无痛JSON解析

最近,JSON已成为最广泛使用的格式,可以在整个Internet上传输数据。 在iOS开发领域,开发人员通常会在Swift中使用JSON数据并将其用于构建iOS应用。 有一些很酷的库,例如SwiftyJSON已经可以在Swift中使用JSON数据了,这些库之所以流行,是因为开发人员不需要使用JSONSerialization处理不可读的混乱来解析JSON。 幸运的是,Swift 4作为Foundation框架的一部分引入了令人惊叹的Codable协议,并且JSON解析成为一行或两行代码。 这是Apple完全支持的解决方案,可以轻松采用。 它提供了定制功能,可以对复杂的场景进行编码和解码。 在本文中,我们将通过构建Github Information应用程序来了解如何使用Swift 4 Codable解析JSON。 在WWDC 2017上,Apple引入了Swift中的新功能,可以使用Swift Codable协议轻松解析JSON。 有关Foundation的新增功能,可以观看谈话,您可以从23分钟开始观看此新功能。 基本上,此协议具有Encodable和Decodable协议的组合,可用于双向使用JSON数据。 总而言之,Swift Codable协议为我们提供了以下内容。 使用Codable,我们可以通过编写很少的代码行将JSONObject或PropertyList文件建模为等效的Struct或Classs。 我们不必为对象中的属性编写构造函数。 全部由Codable处理。 我们只需要扩展我们的模型以符合Codable,Decodable或Encodable协议即可。 Swift的强数据类型与JSON的丢失数据类型之间的不匹配已由Swift编译器内部处理。 现在,我们可以处理Swift Data类型,例如Date,URL,Float等 复杂的JSON可以使用嵌套结构轻松建模,以提高可读性。 使用JSONDecoder解析实际JSON成为一线人 已经有许多关于该主题的文章,涵盖了Codable协议的端到端介绍。 但是在这篇简短的文章中,我们将使用GitHub API并构建一个示例应用程序来简要演示此功能。 我们将使用非常著名的GitHub API来演示此功能。 我们将构建一个简单的应用程序,该应用程序使用GitHub用户名,并在单击“显示”按钮时显示一些信息。 有一个API可显示GitHub用户的公共信息,例如,我可以使用此API端点找到GitHub帐户的详细信息 https://api.github.com/users/shashikant86 这将以JSON格式返回信息,该信息目前看起来像这样。 { “登录”:“ Shashikant86”, “ id”:683799, “ avatar_url”:“ https://avatars0.githubusercontent.com/u/683799?v=4”, “ gravatar_id”:“”, “ url”:“ https://api.github.com/users/Shashikant86”, “ html_url”:“ https://github.com/Shashikant86”, “ followers_url”:“ https://api.github.com/users/Shashikant86/followers”, […]

快速错误处理

根据Apple的说法:错误处理是响应程序错误状态并从错误状态中恢复的过程。 Swift为运行时引发,捕获,传播和操作可恢复错误提供了一流的支持。 我们使用枚举对错误进行建模。 enum需要符合Error协议,这使我们能够将值与每种case相关联,并用于错误处理。 例如,这是我们如何表示失败电话的错误情况: 列举CallError:错误{ 案例号 外壳没有足够的电池电量 } 通过在函数末尾添加throws ,我们可以指定函数可以引发错误。 一旦函数抛出错误,我们就可以catch该错误并使用do-try块进行处理。 根据Apple的说法:要表明函数,方法或初始化程序可能引发错误,请在函数的参数后面的声明中编写throws关键字。 标有throws的函数称为throwing函数 。 如果函数指定了返回类型,则在返回箭头( -> )之前编写throws关键字。 因此,根据该定义以及上面创建的错误,我们创建一个函数来throws func doACall()引发{ 如果lostInTheWoods { 抛出CallError.noSignal }否则,如果batteryNeedsMoreJuice { 抛出CallError.noEnoughBatteryPower } 打印(“所有称职的妈妈”) } 如果在执行调用时我们发现lostInTheWoods或batteryNeedsMoreJuice为true ,则此函数将throw错误。 这基于CallError枚举。 为了捕获和处理CallError.noSignal或CallError.noEnoughBatteryPower我们需要在do-catch块中try 。 做{ 尝试doACall() }捕获CallError.noSignal { 打印(“爬山”) }捕获CallError.noEnoughBatteryPower { 打印(“插入手机”) } 考虑到如果没有错误, catch块将被忽略,您可以通过catch块识别函数抛出的错误。 您可以在此处查看游乐场代码。 资料来源: 错误处理 错误处理简介 我希望您喜欢这篇文章,并且总体上觉得它很有用。 并且不要犹豫,留下反馈或任何问题。 谢谢!

通过使用自定义代码段提高生产力

如何在Xcode中创建自定义代码段 在开发过程中,我们多次编写重复的代码。 通常,我们遵循复制粘贴,但是在这种方法中,我们需要删除旧代码,然后添加新代码,这很耗时。 在我开始从事iOS开发的工作时,我创建了自定义代码段,但后来我忘记了一段时间。 几天前,我了解了Alex Bush的自定义代码片段,并意识到它确实是在开发过程中使用的好工具。 当您不通过脚本为每个模块生成体系结构类时,代码段也很有用。 xcode中有很多预定义的代码片段。 您只需要将所需的代码段拖动到编辑器区域并使用即可。 有时,您可能必须根据要求编辑一些变量名。 创建自定义代码段的步骤: 编写一段代码并选择。 右键单击所选代码,然后选择Create code snippet 注意:占位符放在 2。 将出现一个窗口,您可以在其中重命名并添加摘要。 标题:代码段的名称,我们可以将其命名为Test snippet 摘要:代码段的描述 平台:可以选择iOS 语言:如果是特定于Swift的,则选择Swift 完成快捷方式:稍后可用来调用代码段的快捷方式名称 完成范围: 全部:默认情况下为All ,它可在All地方使用。 点击+图标可以添加多个范围 类实现:如果我们希望快捷方式仅在类实现内部起作用。 它也可以在结构和Swift扩展中使用。 代码表达式:我们可以将此选项与三元运算符一起使用。 函数或方法:如果快捷方式应仅在函数内部起作用。 字符串或注释:自定义日志消息或注释模板 最高层:如果 快捷方式应该只在顶层(即课外)上使用。 3.创建代码段后,可以通过双击或拖动n拖放从代码库中使用它。 实际值或变量名可以用占位符代替。 4.可以通过左键单击+删除按钮删除片段。 5. 导入/导出自定义代码段:可以在以下位置找到自定义代码段 ~/Library/Developer/Xcode/UserData/CodeSnippets 完整的要点可以在这里找到:

Swift 4中的桥接模式

桥接模式将抽象与其实现分离开来,以便两者可以独立变化。 当我第一次学到这个时,桥接模式使我非常高兴。 当您不知道确切的业务逻辑要实现时,但是由于项目的截止日期而需要丰富抽象时,它确实可以为您提供帮助。 当业务逻辑来自客户需求时,仅需对业务逻辑进行编码。 类型:结构图案 也称为:手柄/主体 结构体: 参加者: 抽象:定义抽象的接口。 维护对类型为Implementor的对象的引用。 RefinedAbstraction:扩展Abstraction定义的接口。 实现者:定义实现类的接口。 该接口不必与Abstraction的接口完全对应。 实际上,这两个接口可以完全不同。 通常,Implementor接口仅提供原语操作,而Abstraction基于这些原语定义更高级别的操作。 ConcreteImplementor:实现Implementor接口并定义其具体实现。 Swift 4实现: 让我们考虑客户的要求是绘制Circle和Rectangle,但是我们仍然不知道如何实现实际绘制这些图形的代码。 在实际情况下,可能由于缺乏几何知识或我们选择绘制哪个数字的第三方图书馆而发生。 那些不知道桥接模式的人将等到完成实际的图形实现后,这可能会延迟开发。 如果在这种情况下遵循Bridge Pattern ,则无需等待实现细节,只需创建我们的抽象类并在整个项目中使用该类即可。 一切都会清楚,让我们继续前进。 抽象基础类。 实施此基类,我们可以扩展抽象并制作将在项目其他部分中使用的具体类。 在下面的示例中, Shape是基础抽象类,而Circle和Rectangle是我们抽象的具体类。 注意draw()方法,实际上该图不是绘制而是与该类的其他类调用方法链接在一起的。 在这里, GraphicsAPI是称为“实现者”的类。 抽象类调用实现者类的方法,这是Bridge模式的关键部分。 在上面的代码中,编写了所有抽象类。 现在,需要根据业务逻辑/实现选择来实现实现者类。 桥接模式的用法精彩。 桥接模式适合于实现的运行时绑定。 根据我们的示例,您可能会注意到我们有2个具体的实现类。 您可以在运行时选择任何一个。 例如,您可以在运行时使用DirectXAPI / OpenGLAPI绘制“圆形”和“矩形”。 在此处找到完整的源代码:Github

Swift 4.1发布过程

这篇文章描述了Swift 4.1的目标,发布过程和预计时间表。 Swift 4.1是对Swift 4.0的源兼容更新。 它将包含对核心语言的一些附加增强功能,以及对Swift软件包管理器,Linux上的Swift的改进,以及对编译器和标准库的总体质量的改进。 Swift 4.1与4.0 不二进制兼容。 它包含各种幕后更改,这是在Swift 5中稳定Swift ABI的工作的一部分。 Swift 4.1计划于2018年上半年发布。 源兼容性 使用Swift 4.0编译器构建的绝大多数源(包括使用Swift 3兼容模式的源)都应使用Swift 4.1编译器进行编译。 在某些特殊情况下,这不能绝对保证。 这包括通过使用长期期待的泛型功能解决了使用泛型的问题,从而解决了编译器中的错误行为或极端情况。 但是,人们的期望是,大多数项目将在没有源代码更改的情况下继续构建。 -swift.org

串行异步操作队列

什么是OperationQueue 从Apple文档 操作队列 根据它们的优先级和准备情况 执行其排队的 Operation 对象。 在将操作添加到操作队列之后,该操作将保留在其队列中,直到它报告完成任务为止。 添加操作后,您无法直接从队列中删除该操作。 OperationQueue具有一个名为maxConcurrentOperationCount的属性,您可以将其设置为1,以使串行 OperationQueue在操作为同步操作时可以完美地工作。 问题 当我想要将其发送到蓝牙时,检测到传感器框架之间存在干扰。 发生了什么事!🤔我们使用很多“ @synthesize”关键字来确保线程安全并防止传感器线程之间的任何干扰。 然后我寻找最佳解决方案,最后我找到了maxConcurrentOperationCount I 那就是我需要的,它将解决我的问题 我开始重构1Sheeld的代码以使用maxConcurrentOperationCount. 不幸的是,干扰仍然发生。 我相信在文档中只能同时执行一个操作,但这并不是为什么。 如果操作同步,则 maxConcurrentOperationCount 可以完美地工作,但是如果该操作是异步的(例如调用API请求或使用蓝牙发送数据),则该操作将无用。 那简单的代码显示了问题 创建操作

Revertir cambios locale en GIT

在我的博客上,您可以解决问题,也可以解决所有问题,请联系我们。 克拉罗(Claro),影响GIT。 我的工作人员是我的“工作人员”,现在负责解决问题。 普埃斯图克·卡达·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普瓦克托·普埃斯图克 Finalmente,Entrando en Materia,Éstetema megustaríadividirlo和2个部分: Cuando buscamos还原cambios语言环境 Cuando buscamos revertir cambios en un repositorio remoto(el cual analizaremos en el siguiente post) 问题 支持“媒体可视化器”的应用程序,可以在iOS上添加列表或添加到列表中。 Al seleccionar una,los datos en pantalla se实际的con dicha图像。 客户服务与客户关系的决定。 Se han tenido 2的大注定为“Versión1”(terminado en el提交5bc6d73 )和“Versión2”(ubicado en el commit c0c5533 )。 客户,客户和客户在任何情况下都应按先例进行分类,然后再从版本1到版本2进行实际操作。 一个复杂的信息系统,一个名为GIT的合作伙伴,一个名为deDeveloproll的合作伙伴,“开发”。 Entonces¿quépodemos hacer? Solución 现实世界中的一切都发生了,水族犯下了一个错误的故事-坎比阿斯·肖恩(cabios que sean […]

我如何成为iOS和网站开发人员

您也可以开始,是什么使您退缩? 欢迎到我的博客! 您可以叫我Lz,我是一个iOS和网站开发人员,他在美国工作,从事Java,Python,Web开发(HTML,CSS和Javascript)和Swift的编程已有3年多了! 通过电子邮件或instagram消息问我的第一个问题是: “如何启动iOS或网站开发?” 问题到了重复和令人讨厌的地步,所以我决定写这个问题。 所以请系好安全带,因为我将向您展示我的故事以及我如何到达今天的位置! 中学 我的故事始于高中(2015年末),当时我选择上计算机科学课。 当时这是一个随机决定,我没有编程知识,也不知道它将带我去哪里。 我们在第一周的首要任务是了解什么是编程及其工作原理。 每个人都被指示要使用Scratch(一种基于块的可视化编程语言)创建任何东西,并使其独一无二。 我创建了一个冰球运动员(一个jpeg图像),他可以根据按键向前或向后移动,最终,如果他向前移动足够长,他会向冰球网射击并得分。 这个项目使我开始爱上编程,因为我能够将自己选择的所有内容放在一起,并创建了一个我的独特作品。 第一周之后,课程将重点放在Java(一种面向对象的语言)上,并将深入探讨对象,方法和类。 我不再觉得自己好像在上学,要时间,而是每天都在经历一个新的自我成长的机会。 课程结束后,我在业余时间构建了小型应用程序,然后开始进行网站开发。 涉足网站开发 大约一年后(2017年初),我开始学习HTML(超文本标记语言)和CSS(级联样式表)。 当时我下载了一个应用程序(SoloLearn),并深入研究了网站的创建方式。 这不是一个好的设计时期,因为我创建的每个网站看起来都很糟糕。 花了几个月的时间来习惯标签和样式。 我不擅长了解如何设置样式和创建某些表格来更改整个网站的标签。 在进入任何代码之前,花了一段时间才将Web开发的思想付诸实践。 一直以来,我从来没有看过什么,也没有独自练习。 许多人认为您可以看着某人做某事,并且您可以在第一次尝试时轻松地做到这一点,而无需再尝试。 这只会使您到目前为止,您将不得不反复参考源。 iOS开发的新手 在2018年中,我为自己购买了MacBook Pro 13”。 我很喜欢iOS应用程序的制作方式,因此我找到了有关Udemy的免费课程,然后跳入了iOS开发。 从一开始我就爱上了Swift,这是一种简单而有趣的语言。 极限似乎无穷无尽。 从课程中构建了一个小型点击游戏之后,我继续为本地企业构建了一个应用程序(不是大型应用程序)。 那里没有完美的地方,并且有大量的错误(这是我的第一个应用程序)。 它于2018年8月中旬推出,具有强大的保留率和用户参与度,这非常令人兴奋和惊奇! 在开发该公司应用程序期间,我决定自己为自己构建一个应用程序。 我从生产力的角度出发,想要构建一个将任务提升到不同水平的应用程序。 想法是,用户会根据每个任务的完成/未命中获得分数。 从2018年9月开始,我开始设计自己的想法。 一开始它是一个快速而小型的应用程序,它专注于用户创建任务,查看他们的分数并拥有一个全球排名委员会来与朋友竞争! 设计,开发和发布Habite花费了将近两个月的时间, Habite于2018年10月24日发布。用户参与度从一开始就飞涨,令人难以置信的是,看到实际的人使用我制造的产品。 习惯将于2019年2月24日开始四个月,与以前完全不同。 现在,它具有白色界面,包含一个高级版本,其中包括每日计划,检查清单,注释和目标,并且每天都在不断增长! 如何开始 我见过很多人想尝试新事物,却花最少的精力。 对于Web或iOS开发,这并不会减少它。 您需要能够编写大量代码,分解并修复错误,并尽可能多地练习。 Udemy是令人难以置信的起点。 他们提供免费和付费课程,几乎可以教授您所有内容。 Teamtreehouse是另一个很好的学习资源。 我没有研究它,但是我听说过很棒的事情! 网络上有更多课程和资源,包括Youtube。 […]