该应用程序的不同字体提供了引人注目的外观和设计,从而在用户脑海中为使用前景创造了积极的形象。 例如,如果您要为杂志或报纸发行公司开发应用程序,则应为该应用程序选择正确的字体,就像用户阅读杂志或报纸一样。 首先,您需要在应用程序中使用的所有字体文件。 字体可以由图形设计师提供,也可以从在线网站获得。 您应该具有.ttf或.otf的所有字体文件,这些文件由XCode支持。 现在,将所有字体文件拖放到XCode特定的文件夹中。 一旦在XCode中添加了字体,请确保所有字体都在那里。 我们也可以通过将其打开到Xcode.SO中来查看字体样式,基本上它的外观如下: 现在,我们必须在info.plist文件中提及所有字体,例如: 我们还可以通过打开它作为info.plist的源代码来添加它,并添加以下代码: UIAppFonts Roboto-Bold.ttf Roboto-Light.ttf Roboto-Medium.ttf Roboto-Regular.ttf FontAwesome.ttf SF-Pro-Display-Bold.otf SF-Pro-Text-Bold.otf SF-Pro-Text-Light.otf SF-Pro-Text-Medium.otf SF-Pro-Text-Regular.otf 现在,我们必须在“ 构建阶段”下的“ 副本捆绑资源”中添加所有字体,例如: 因此,成功将字体添加到了我们的项目中。 现在,我们将通过在日志中打印所有可用字体来对其进行测试。 编写以下漂亮代码以在日志中打印字体: 对于家庭:UIFont.familyNames中的字符串 { 打印(“ \(家庭)”) 用于名称:UIFont.fontNames(forFamilyName:family)中的字符串 { 打印(“ == \(名称)”) } } 希望本文能帮助您在iOS应用中使用自定义字体。 如果对此有任何疑问。 您可以自由地联系/评论。
在讨论委托时,我经常看到与通知,观察和回调(关闭或阻止)的比较。 解决许多常见问题时,这些概念有所不同。 本文介绍了委派概念,如何实现适当的委派,最佳实践,并将委派模式与其他方法进行了比较。 我更喜欢将委托作为“四人帮”一书中描述的概念与可可/可可接触中的委托模式分开。 委托概念 委托(动词)-委托(任务或责任)给另一个人。 新牛津美国词典 在编程术语中,该引用翻译为委托(任务或责任)另一个对象。 委托使用对象组合来允许自定义和代码重用,并且它是继承的替代方法。 委托对象与其委托对象之间的关系类似于子类如何将方法转发给其超类。 突出的区别是继承是静态的,而组合是动态的。 使用委托可以在运行时更改对象的行为。 在这里,我有一个示例对象层次结构。 ShapeView是提供笔触和填充颜色的抽象类。 RectangleView和EllipseView通过重写draw(_:)方法实现绘图逻辑。 在Swift中,在扩展中实现协议很方便。 协议声明 @protocol 委托 < NSObject > 协议 委托 : AnyObject 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 Swift编程语言 协议非常适合委派模式,因为它们可以对需求进行适当的控制,而控制量不超过需求的数量。 这样,委托对象不知道委托的实现细节。 Delegate协议继承了NSObject协议,以便为可选方法提供自省功能。 在Swift中, Delegate声明为仅类协议,以将其用作weak引用。 替代声明使用的是非正式协议,通常是NSObject类别,但是这种方法被认为是旧方法,并且在现代框架中未使用。 属性和内存管理 @property ( nonatomic , weak ) id < 代表 >代表; 弱 var委托: 委托 ? Objective-C中的属性声明为id : id是指向任何对象的指针,委托不限于NSObject子类; Delegate继承了NSObject协议以提供必要的运行时方法。 为了防止强引用循环,将委托属性声明为weak 。 […]
(本文最初是为我的博客 vojtastavik.com撰写的 ) Objective-C是我专业学习和使用的第一门编程语言。 使用ObjC时需要了解的第一件事是缺少名称空间。 整个Objective-C运行时的行为就像一个名称空间。 为了防止名称冲突,Objective-C使用名称前缀。 您只需为所有类的名称加上前缀就可以创建自己的伪命名空间。 这就是为什么我们要使用UI View, NS Object和MK MapView之类的名称的原因。 Swift具有模块定义的名称空间,因此不再需要名称前缀。 我不得不说我想念他们。 将您的姓名缩写作为班级名称的一部分,会带来一种奇怪的满足感。 让我们做一点思想实验。 UITableView是iOS开发的重点之一。 它是iOS 2.0中引入的,它是我们仍在积极使用的最古老的API之一。 如果UITableView API名称是在2017年引入的,仅支持Swift,那么UITableView API名称会是什么样? 让我们玩一下命名空间。 由于UIKit拥有自己的命名空间,因此我们可以简单地将Table用作表视图相关类型的“基础”命名空间。 如果模块中已经有一个名为Table的类型,则需要将UIKit版本称为UIKit.Table 。 但是,在大多数情况下,使用简单的Table完成工作。 在操场上进行模拟非常简单: 这是在代码中使用UITableView 2017 Swift专用版本的方式: iOS世界中最著名的两个协议呢? UITableViewDataSource和UITableViewDelegate呢? 让我们也给他们一个合适的名称空间: 我们不要在这里停下来。 我们可以命名空间还有很多! 您可能会明白…这里的真正问题是: 这就是我们想要的吗? 对所有事物进行命名空间是一个好主意吗? 像这样构造类型非常好。 层次结构清晰可见,全局命名空间的“污染程度”较小。 简短的名字也对新来者不那么害怕。 让我们也考虑一下缺点。 关于类型的推理可能更加复杂,尤其是在名称冲突的情况下。 根据上下文的不同, Table有时可以表示UIKit.Table ,有时不可以。 嵌套类型的自动补全当前仅在一个名称空间“级别”中起作用,因此您目前无法对嵌套类型执行以下操作: 在哪里划界线? 撰写本文的主要灵感来自我正在从事的项目。 我意识到,即使使用Swift强大的命名空间功能可能会更好,我还是倾向于选择与Objective-C相似的名称作为类型。 我对哪种方法更好没有很坚决的看法,“在命名空间中过多使用”这一行也没有。 我很高兴听到有关此主题的更多意见! 随时在下面发表评论。 […]
最新的Xcode不支持最新的iOS 如果您在10.2上使用iOS设备使用Xcode 8.1模拟您的应用程序,则可能会出现此错误,并且几乎没有信息可以修复它。 我做了以下工作。 1.从developer.apple.com/download下载Xcode-beta.app 您可能需要登录,这需要40分钟,这与Xcode的普通版本相同。 下载后,将Xcode-beta.app移至/ Application /目录。 mv〜/ Download / Xcode-beta.app / /应用程序 2.在Xcode-beta.app目录中找到iOS 10.2的内部版本号 您需要在Xcode-beta.app中找到iOS 10.2的内部版本号。 cd /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSuppor 吨/ 您应该会看到类似这样的内容。 3.在Xcode-beta.app中创建从iOS 10.2到Xcode.app的符号链接 要使用Xcode(而非Beta)在iOS 10.2上模拟应用程序,您需要在Xcode中构建该10.2。 在这两者之间创建符号链接。 sudo ln -s /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.2 \ \(14C5077a \)/ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/设备支持 确保将内部版本号14C5077a替换为您发现的内容,具体取决于您的Xcode-beta.app。 退出并重新启动Xcode。 您应该能够在iOS 10.2设备上运行您的应用程序。 请参阅此以获取更多参考:将iOS 10.2设备与Xcode 8.1一起使用。
在一个项目的工作期间,有一个本地化(阿拉伯语)的要求。 对于本地化,目前最简单的解决方案是检查选择了哪种语言,然后根据条件的变化进行相应的检查。 假设您要更改按钮的标题/图像,首先要创建该按钮的出口,然后在ViewDidLoad中检查所选语言,然后更改图像和标题。 对我来说,问题是为什么我应该为每个控件每次都添加插座,就像我需要本地化按钮,图像,文本字段一样,我只需要为其本地化创建插座。 为了避免所有这些事情,我迅速创建了几个扩展,这些扩展可以直接工作而无需为任何控件创建出口。 通过拥有这些文件,可以节省大量时间,而无需创建任何出口即可完成所有这些工作。 您可以在以下位置找到所有这些要点:
在WWDC 2016期间的Session 216中,Apple宣布对UIKit动画进行了相当低估的更新,该更新将标准的UIView.animate(),关键帧动画甚至Facebook的POP框架彻底抛弃了。 它称为UIViewPropertyAnimator ,它允许高度交互和可自定义的动画。 您可以在此处阅读有关此内容的更多信息,并在此处学习基础知识。 在尝试使用UIViewPropertyAnimator并了解适用于其停止和非活动状态的所有不同规则之后,我尝试通过设置约束动画来将事情提升到一个新的水平。 我发现这非常强大,因为您可以使用UIViewPropertyAnimator的.fractionComplete()方法控制动画的进度。 我想在这个交互式汉堡菜单中分享一个约束动画的示例,该菜单受Javi Perez的Nominazer应用程序的启发。 我首先使用UIViewPropertyAnimator的实例,使用平移手势识别器更新.fractionComplete(),将汉堡包中的三行融合为一行。 当用户结束平移手势时,UIView.animate()块会形成一个“ X”。 然后,用户可以使用新的UIViewPropertyAnimator将X的行收敛为一行。 最后,UIView.animate()块用于形成原始的三行汉堡。 如您所见,UIKit的较早的动画方法可以与UIViewPropertyAnimator结合使用,以创建与UI的无缝交互。 您可以在我的GitHub页面上下载此交互式汉堡的代码。 (请注意,上面有很多个人笔记。) 回到当前的主题: 动画约束。 同样,您可以在此处下载该项目的完整源代码。
如果您是iOS开发人员,则每天都会遇到UITableView和UICollectionView。 您将需要使用在静态位置声明的丑陋标识符字符串来注册Cell或UITableViewHeaderFooterView或UICollectionReusableView重用单元格。 所以你的代码将是这样的 完成ReusableView.swift类以包含在项目中: 希望这将帮助您减少代码混乱,并简化注册和重用TableView和CollectionView单元格,HeaderFooterViews和ReusableSupplementary视图的使用,而无需在每个单元格类中维护难看的静态字符串常量。
在处理基于大型产品的应用程序时,我发现应用程序需要花费更多时间来构建应用程序。 因此,我的下一个目标是减少构建以及代码优化。 就我而言,最初的目的是使用Build Time Analyzer for Xcode来识别并修复最耗时的区域。 如何为Xcode设置构建时间分析器。 转到此链接 ,下载或克隆项目。 之后,您只需要将该项目打开到xcode中,然后按CMD + B即可构建该项目。 构建完成后,您需要存档构建。 归档完成后,您需要导出此构建,并选择选项“ 导出为macOS App” 。 现在将其保存在您的位置并打开该文件夹并安装应用程序。 那个 现在最大的问题是此应用程序如何识别我们的应用程序并生成分析报告。 遵循此指示 我们在应用程序上添加自定义标志。 1.选择目标,然后转到Build Settings-> Swift Compiler-> Other Swift Flags并添加此代码-Xfrontend -debug-time-function-bodies。 确保将以下标志添加到目标的“构建设置”。 2.清理项目(CMD + Shift + K) 3.构建您的项目(CMD + B),然后等待它完成。 构建完成后,转到“ 构建时间分析器应用程序” ,然后单击您的应用程序。 现在,您可以查看Build Time Analyzer App生成的报告,并分析哪些功能和代码需要花费更多时间。 基于此,您可以优化代码并减少构建时间。 确保您遵循的是正确的快速语法格式。 另外,您需要使用耗时较少的功能。 例:- 使用if-else语句的保护瞬间。 谢谢 希望您今天学到了新东西。 请享用!! […]
在构建/编译项目时,我写了一些Xcode错误,以提醒和注意我自己,以避免将来出现这些错误。 😀 [您已被警告]这些错误解决方案不是解决问题的唯一方法。 这发生在我(和您)身上,但是解决方案可能无法解决您的问题。 如果是这样,请转到StackOverflow😀 分割错误:11 分段故障11 当我有CocoaPods依赖项时,会发生这种情况,该依赖项声明了这样的SomeType类型,当然,声明一个具有相同名称的新类型的品牌是“危险的”(在我的情况下,我声明具有相同名称的typealias)。 在得到这种类型的错误(我是一个初级开发人员,无法确定this是编译错误还是构建错误)之前,Xcode显示一条警告,通知您发生了内部错误。 看到? 在上面的错误信息中,传递JSQMessage并将其转换为JSQMessageData类型,该类型总是失败并引发错误,因为编译器从我的typealias中获取JSQMessage.Type: typealias JSQMessage = (String, String, String) -> Void 如何解决这个问题? 因为我已经声明了类型别名的名称已经被某个框架保留,所以我只重命名了类型别名。 typealias MyMessage = (String, String, String) -> Void 固定!!
Swift已经问世了三年多了,随着我对语言的了解,我尝试将更多的函数式编程技术集成到我的代码中。 来自Objective-C的广泛背景,我承认我在第一次学习Swift时确实不了解map和flatMap 。 最终,我对这些概念很满意,可以开始使用它们来替换我的一些for循环。 直到最近,我才真正认为map和flatMap有用。 直到我参加了Neem Serra的Map和FlatMap Magic演讲,才尝试! 在Swift纽约2017年大会上,我的眼睛向世界展示了map和flatMap的其他伟大用途。 这篇文章中的大部分内容都是基于Neem的介绍,因此请确保在有机会的情况下查看她在Realm Academy上的演讲! 地图 我可以为map提出的最基本定义是,它将数据转换为其他类型。 通常,它用于遍历集合并转换每个元素,因此您可以执行诸如从Int数组创建String数组之类的操作。 平面图 与map一样, flatMap将数据转换为其他类型。 FlatMap还具有“删除图层”的特殊属性。一个示例是删除嵌套层,其中将二维数组“展平”为一维数组。 另一个示例是从填充有可选元素的数组中删除nil元素。 地图和FlatMap基础 设定 就像Neem的演讲一样,我将展示使用纸杯蛋糕的地图和flatMap技术。 这是我们将使用的模型: 如您所见,该模型非常简单。 纸杯蛋糕具有flavor属性,有一种方法可以恢复该风味。 实际上,不需要getFlavor()方法,因为我们可以直接访问flavor属性。 但是对于我们的示例,我们将其保留不变。 接下来,我们将创建一些Cupcake并将其粘贴在cupcakes数组中: 其余示例将使用此基本设置来说明不同的地图和flatMap技术。 文章结尾处还提供了一个游乐场。 地图—旧方法 这段代码看起来熟悉吗? 我知道我第一次学习Swift时就以这种风格编写代码感到内。 在这里,我们将Cupcake的数组转换为String的数组。 地图—新方法 使用map ,我们可以将上面的4行代码简化为一行。 整齐! 地图—错误的方式 您实际上应该只使用map来变换元素。 虽然从技术上讲可以使用map 生成元素,但应尽可能避免这样做的冲动。 一个好的经验法则是注意忽略闭包参数。 如果您正在编写类似.map { _ in … } (请注意下划线 ),则可能是您未正确使用map 。 使用可选的映射 地图也可以用于可选项。 作为参考,让我们看一下在不首先包装它们的情况下尝试使用它们时通常如何表现。 […]