Swift –使用AVPlayer制作一个音乐播放器2(后台播放,操作,图片显示) 在前文中,我介绍了如何使用AVFoundation框架来制作一个简单的音频播放器(点击查看)。但是这个播放器不支持后台播放,程序退到后台时音乐就会停止播放。播放功能。1,效果图… www.hangge.com 在Swift中使用NSNotificationCenter NSNotificationCenter可以被视为在您的应用程序中传达信息的工具。 不像推送或本地… medium.com Swift NotificationCenter使用–掘金 首先来看一下API:/ ****************通知中心**************** /打开类NotificationCenter:NSObject {// … 绝情 Swift –使用NotificationCenter发送通知,接收通知 1,通知(NSNotification)介绍这里所说的通知不是指发给用户看的通知消息,而是系统内部进行消息传递的通知。要介绍之前,我们需要先了解什么是观察者模式。 … www.hangge.com
如果您是熟练的iOS开发人员,Internet上将充满信息,这些内容涵盖了程序化视图相对于情节提要的优势。 如果您正在阅读此书,则可能是您想学习或正在学习iOS开发。 在这篇文章中,我将简要提及为什么即使是绝对的初学者也应该避免使用故事板。 对于初学者,重要的是要了解在iOS应用开发中创建视图时有两种不同类型的方法-一种是使用Storyboard创建视图,另一种是以编程方式创建视图。 首先,由于您可以轻松创建视图,因此故事板似乎是一个非常有吸引力的选择。 由于其拖放功能,它几乎使有抱负的iOS开发人员感到无敌,直到他们遇到一个更复杂的项目并遇到麻烦为止。 突然之间,您将需要为模型和控制器编写复杂的代码,而从无与伦比的下降将感觉像是跳伞失败的跳伞。 这就是为什么我建议您始终开始使用第二种方法(程序化视图)来学习iOS开发,同时避免使用称为Storyboards的学习曲线快捷方式。 当开发人员使用情节提要来创建应用程序的视图时,开发人员通常会花费超过50%的开发时间来创建情节提要。 这是您本可以用来在Swift中实现流利度的大量开发时间。 另一方面,学习以编程方式创建视图将迫使您仅专注于实际学习Swift,了解逻辑并习惯语法。 这绝对是学习Swift(和/或Objective C)语言并提高您的编码技能的最佳方法。 对我来说,这是为什么您应该通过编写视图代码来开始学习iOS开发和Swift的最大原因。 与情节提要相比,编程方法还有许多其他优点。 我认为,两个最重要的优点是: 程序视图导致快速的开发周期。 一旦开发人员习惯于以编程方式创建视图,则与使用情节提要板相比,可以更快地创建视图。 一切都与应用程序开发的速度有关。 如果使用程序化视图创建应用程序,则与大型开发团队进行协作会容易得多。 使用情节提要进行共享和协作非常困难。 已经有足够的讨论了。在下一篇文章中,我将向您展示如何使用“自动”布局以编程方式创建视图,并向您展示最简单的方法。
为什么? iOS开发人员迟早需要在视图之间使用自定义动画。 这通常是位置变化和缩放的混合,主要是将一个视图的框架缩放到另一个视图的框架动画。 您可能首先尝试这样的事情: 有时这会起作用,但如果myView有任何子视图,则不会myView 。 例如,如果myView内部有标签,则myView视图的框架将更改,但标签将保持不变。 相反,我们需要标签与超级视图一起缩放。 我们可以将框架动画应用于标签的框架,但是虽然这会更改标签的大小,但字体不会缩放。 我们需要更好的方法。 我将向您展示如何使用视图的transform属性和图层的position来实现目标。 位置和锚点 在iOS中,每个UIView都有一个带有两个有趣属性的层,用于我们的目的: anchorPoint和position 。 这两个属性已连接,更改anchorPoint或图层的position将更改其在父视图中的位置。 position属性是anchorPoint在超级视图中的位置,因此更改anchorPoint或position将影响子视图在其容器超级视图中的位置。 position值代表屏幕上的点,因此设置x = 1会将视图向右移动一个点。 anchorPoint值不同。 对于anchorPoint ,设置x = 1将在视图的右边缘设置anchorPoint,而x = 0会将其设置在视图的左边缘。 让我们看动画 让我们用一些动画来阐明所有这些。 从视图和子视图开始: 让我们将初始正方形从 至 让我们分解一下,从位置开始,使smallSquare最终在容器内部居中。 好的,那很容易。 现在,我们将smallSquare移到中心时将其缩放到其大小的两倍。 很好,看起来不错。 现在,我们可以以此为基础来创建新功能,该功能会将视图从其初始框架移至新框架。 现在我们可以将上面的转换写为 现在为anchorPoint 我们假设anchorPoint始终设置为x:0.5和y:0.5。 这是默认位置,但是有人可能将anchorPoint移到了其他位置,我们需要考虑到这一点。 我们需要从 至 现在,无论anchorPoint的位置如何,视图都将正确移动和缩放。 出于缩放和位置更改的目的,我们不需要移动图层的anchorPoint,我们可以仅依靠layer.position和transform来实现源自视图中任何点的动画效果。 摘要 我创建的方法可以使您的生活更轻松,应用程序更流畅。 下面是完整功能,作为对UIView的扩展。 我还将附上一个游乐场文件,以便您可以尝试。
如何创建没有名字的功能! 介绍: 上一部分我们学习并研究了如何以多种方式创建闭包以及如何从函数传递和返回。在这一部分中,我们将讨论Trilling闭包 尾随封口: 尾随闭包只是在函数的调用括号后作为最后一个参数传递闭包,下面举个例子: 在这里我创建了一个可以带闭包的函数。现在让我们直接在函数上使用普通闭包来实现它: 现在像这样使用颤音闭合 所以在这里我们在调用的括号后面使用闭包参数。当参数变得太长时。在琐事闭包中,我们不需要写参数名。如果函数有一个参数和它的闭包,那么我们不需要写括号。比它变成这样 它的封闭之美!
在本教程的最后,您将了解如何实现并处理一对多和一对一的关系✨! 您可以在github上找到本教程的 结果 指数 1.创建并生成一个新项目 2.一对多/一对一/多对多 3.建筑模型:Pokemon(与用户有关) 4.调整模型:用户(定义与口袋妖怪的关系) 5.建筑控制器:PokemonController 6.调整控制器:UserController(删除相关的宠物小精灵) 7.调整视图:列出用户的所有宠物小精灵 8.调整视图:实现一个表单来创建新的口袋妖怪 9.从这里去哪里 1.创建并生成一个新项目 我们将使用上述教程的结果作为模板来创建我们的新项目: 蒸气新项目名称–template = vaporberlin / my-first-crud-using-leaf 在生成Xcode项目之前,我们必须在Package.swift中更改包名称: // swift-tools-version:4.0 导入PackageDescriptionlet包=包( 名称:“ projectName ”, 依赖项:[ .package(URL:“ https://github.com/vapor/vapor.git”,来自:“ 3.0.0”), .package(URL:“ https://github.com/vapor/leaf.git”,来自:“ 3.0.0-rc”), .package(网址:“ https://github.com/vapor/fluent-sqlite.git”,来自“ 3.0.0-rc”) ], 目标:[ .target(name:“ App”,依赖项:[“ Vapor”,“ Leaf”,“ FluentSQLite”]), .target(name:“ Run”,依赖项:[“ App”]), .testTarget(name:“ AppTests”,依赖项:[“ App”]), ] ) 现在在终端的根目录projectName /上执行: 蒸气更新-y […]
Kitura是IBM创建的服务器端Swift Web框架。 它已获得MIT许可,免费使用,并且源代码是开放源代码。 最近,随着2.0版本的发布,Kitura团队引入了新的Codable Routes功能,这使开发人员可以非常轻松地使用Swift 4 Codable自动处理URL请求和响应。 Swift 4引入了Codable协议,这意味着实现Codable协议的类型能够将其属性解码和编码为任何外部表示形式,例如JSON。 在语言级别上,许多原始数据类型(例如Int,String,Double,Data,URL)已经是Codable类型,包含Codable类型的Array和Dictionary也已经是Codable类型。 struct TodoItem:可编码{ var id:字符串 var标题:字符串 var内容:字符串 } //将TodoItem结构编码为JSON数据 让todoItem = TodoItem(id:“ 1”,标题:“ hello”,内容:“ world”) 让jsonData =试试! JSONEncoder.encode(todoItem)//将JSON数据解码为TodoItem结构 让todoItem2 =试试! JSONDecoder.decode(TodoItem.self,来自:jsonData) 使用内置的JSONEncoder和JSONDecoder类的Swift,从JSON编码和解码可编码对象,反之亦然。 使用Codable,我们不必手动解析JSON或使用第三方库(如SwiftyJSON)进行解析。 可编码的工作就像魔术一样。 使用Kitura Codable Routes,我们可以创建一个Router终结点方法,该方法接受请求的Codable对象,并将完成闭合传递给该Codable对象作为响应。 作为开发人员,我们不再需要手动编写编码和解码逻辑。 要查看所有这些操作,让我们使用内存数据存储区为TodoItem构建一个CRUD API。 进口Kitura 导入KituraContractsstruct TodoItem:可编码{ var id:字符串 var标题:字符串 var detail:字符串 } var todos = [ TodoItem(id:“ 1”,标题:“清理房子”,详细信息:“我的房子”), TodoItem(id:“ […]
迅捷泛型 许多人可以理解泛型,阅读泛型代码并遵循代码,但发现使用泛型编写代码或避免使用泛型是很困难的。 让我们可以轻松地考虑适当地使用泛型。 Swift是强类型语言,也是静态类型语言。 当我的意思是强类型时,每个函数参数或返回类型都需要一个类型,并迅速检查传递/返回的值是否属于该类型,否则会发生编译/运行时错误。 当我说静态类型时,我的意思是swift仅检查所有这些编译时间,否则抛出错误。 好吧,如果您想告诉编译器我不确定我将处理的“类型”是什么,并且它可以是动态的? 多数民众赞成在我们排序到动态打字。 但是,使用像Swift这样的强静态类型语言,我们如何实现呢? 那就是泛型出现的地方。 假设您实现了可快速处理“字符串”的STACK,它将类似于以下内容: 现在,说我希望能够实现一个存储整数的堆栈。 最后,我将写另一个与上述完全相同的Stack数据结构,其中函数和返回类型的参数为“ Int”而不是String。 可以这样说,我可以根据需要的数据类型创建动态dataType结构实例。 当然,在实例化时,您必须指定要查找要存储的堆栈的数据类型。 在下面的代码中,其表示为。 注意:T可以是任何东西。 U也可以说G或A或ZZ或GENERIC。 注意:编写任何通用代码的最佳方法是,在我的案例String中编写代码以采用特定的数据类型,然后将其替换为T。在我们的示例中,定义Struct的定义方式为Struct GenericStruct 。 实例化时,请查看其用法。 GenericStruct ()。 任何与泛型 您总是可以说,好吧,我将通过使用下面的Any来解决此特定问题-> 那为什么要泛型呢? 好吧,它解决了特定类型的问题。 参见下文。 泛型基本上告诉编译器:“稍后我将为您提供一个类型,我希望您 在指定的任何地方 强制执行该类型 。” AnyObject基本上告诉编译器:“不用担心这个变量, 无需强制执行任何类型,在这里 我可以做任何想做的事情。” 如果要使用协议,泛型将如何适合那里? 这可能真的很有用。 这是associatedTypes和typealias出现的地方。 请查看以下内容,如何通过类型别名将协议中的项目与动态类型T相关联:
市场上有许多免费提供的SDK和可重用组件。 有人可能会问,编写SDK的黄金标准是什么。 在回答这个问题时,我们始终可以仰望Apple。 它为新SDK引入了精心制作的文档,编程指南以及大多数SDK组件和框架的示例代码,做得非常出色。 为了符合该标准,开发人员在设计移动SDK和编写API时应格外小心,这一点至关重要。 开发iOS SDK或库是指提供稳定且令人愉悦的API,这些API向最终用户/开发人员展示产品的功能。 此外,SDK还包含文档和示例代码,以帮助开发人员使用它。 如您所知,开发移动SDK绝非易事。 但是,遵循某些规则可以确保它达到完美。 在为不同的产品开发了许多SDK之后,我们对它有了更好的了解。 因此,我们在此为您提供了一些开发iOS SDK的最佳实践。 为什么 您必须问自己的第一个问题是为什么要构建SDK: 是否因为您要提供一些可以供多个应用程序开发人员使用的服务? 是否因为您想使用户不受内部实现,API调用和服务的业务逻辑的影响? 还是因为您需要在兼容性,可伸缩性和将来的增强方面具有灵活性,并且不希望其他人修改您的业务逻辑或服务或反向工程师? 如果您对以上任何一个问题的回答都是肯定的,那么您必须构建一个SDK。 什么 一旦确定要构建SDK,就必须确定要在SDK中包含哪些功能。 它需要用户界面还是没有UI? 它是否搭载在其他应用程序或系统框架的UI上 启用功能之前,是否需要任何明确的用户权限? 它是否涉及Web视图,网络调用,安全注意事项或任何其他平台设备特定的功能? 怎么样 在此阶段,您将决定如何开发移动SDK。 精心设计的SDK应该旨在使您的生活更轻松,但这是一个繁琐的过程,涉及大量工作,因此您可以帮助创造最佳的用户体验。 在继续开发移动SDK之前,您需要考虑以下一些不同方面。 简单 市场上大多数令人愉悦的框架,可重用组件之所以没有名声,并不是因为工作或API的复杂性,而是因为应用程序开发人员在集成SDK时遇到的困难。 当SDK难以集成并且开发人员无法掌握SDK提供的功能时,这确实很痛苦。 这是自动化时代。 为了说服开发人员使用您的SDK,必须在SDK集成中调整自动化。 这可以通过脚本,可可豆荚和提供Xcode模板来完成,该模板将下载并与指定目标自动集成。 集成了SDK后,应用程序开发人员便开始研究API。 作为SDK开发人员,通过引入与开发人员不同的新约定,“不要发明新的轮子”。 最好遵循标准约定,命名应用程序开发人员熟悉的变量,方法和设计模式。 简化移动SDK的提示: 使用您的应用密钥和机密ID初始化SDK的过程不应超过一行。 在您的SDK中提供特定的接口和对象,并对其进行详细记录。 处理SDK中的错误和异常,并通过回调或委托将状态返回给应用程序。 安全 SDK开发中最重要的方面之一是框架的安全性。 在处理付款时,重要的是要了解各种API的安全性方面,并确保没有以任何形式存储与客户的付款工具有关的敏感信息。 这里要遵循的一些最佳实践是: 对所有网络呼叫使用SSL。 使用证书固定可避免中间人攻击,并确保SDK与正确的服务器通信。 避免使用本地存储敏感信息。 如果确实需要,则以加密方式安全地存储它。 事务完成后,清除所有系统创建的Web缓存数据和其他本地数据(如果已存储)。 可扩展性 支付系统总是在变化,可能必须将新的支付工具添加到SDK中。 为了轻松添加更新的支付工具,请使SDK与后端支付工具的更改无关。 如果SDK使用基于Web的后端,则可以这样做,因为可以修改网页以包含新的付款方式,而不会影响SDK。 […]
CocoaPods无需介绍。 这个流行的依赖性管理器与Carthage以及Swift Package Manager共享舞台。 这篇简短的文章将探讨它对我们导入到项目中的Pod的一种影响。 实际上,看来CocoaPods当前在我们在iOS上使用的每个Pod上都添加了一个UIKit导入。 我们可以举RxSwift Pod为例。 UIKit没有导入到该项目中,它完全独立于此UI框架。 Krunoslav Zaher在评论中证实了这一点。 好吧,我记得我发现一个ViewModels中使用的UIKit类时在MVVM应用程序上工作,这很糟糕。 该项目确实进行了编译,但是在此特定文件中没有导入UIKit 。 我们很快就发现,由于RxSwift的导入,它是可以自行编译UIKit的,因此可以进行编译。 还似乎是由于使用CocoaPods导入了框架而发生了此行为,但没有通过Carthage或通过直接构建导入该框架。 从技术上讲,此导入似乎是通过CocoaPods端头文件的生成和使用来完成的。 当Pod以iOS或tvOS平台为目标时,会生成此标头,其中包含谈论导入。 它有什么害处? 老实说,除了最纯粹的主义者以外,它并没有做什么用。 如果我们保留上面的示例,我们都可以看到在ViewModel中执行此UIKit导入并不是最佳方法,因为它引入了与UI的依赖关系。 我们不会显式地完成它,但是会隐式地完成它。 在这里,我们可以开始讨论这种行为,即依赖项管理器干扰其依赖项。 可以吗 如果是,在什么范围内? 如果不是,为什么呢? 更进一步,由于这种添加不会改变其源代码,是否可以将其视为对源材料的干扰? CocoaPods开发人员已经知道此行为。 真正有趣的是它对系统的重要性。 确实,让我们退后一步。 如果所有实时项目都重新安装了其Pod,而没有自动添加此导入怎么办? 实际上有多少个类确实需要UIKit ? 全世界同时有多少次编译失败? 狗和猫在一起生活,歇斯底里。 规格可能会大量损坏的这种观点有助于我们了解改进的难易程度,以及为什么它仍是热门话题。 遵循这个CocoaPods的故事将是非常有趣的:开发人员将如何继续改变它,如果这样做的话,将会带来什么后果等等…… CocoaPods是一个很棒的工具,由一个很棒的社区构建和维护。 他们极力激发人们的贡献,这使他们变得更加出色!
vvvvvvv 本文是本文的旧版本 。 我强烈建议您改为阅读 新文章 。 ^^^^^^^^ 这种创建pod的方式使用了Cocoapods文档中的设置方式,我认为它们的设置方式使添加字体图像和管理文件结构变得异常困难。 现在开始上古历史课: 阅读了7分钟,但应该完整。 如果您的机器上没有Cocoapods,则应通过在终端上输入以下内容进行安装: sudo gem install cocoapods 您也可以使用相同的命令更新Cocoapods。 转到要存储cocoapod的目录。 ( cd )然后运行: pod lib create nameYouWantForYourProject 当它自动生成并正确设置您的广告连播时,它会提示您一些问题: 它应该自动创建并打开一个项目: Cocoapod服务会找到源代码托管在源存储库中(例如,在Github上),这就是它用来定位代码,创建内部版本并允许其他人下载的代码。 让我们为其创建一个新的仓库。 不要使用READ.ME,许可证或.gitignore初始化存储库,因为本地存储库已经自动生成了一个。 (从您在pod lib create nameYouWantForYourProject) 单击create repository,在终端中转到您的项目: cd nameYouWantForYourProject git add . git commit -m “first commit” 然后复制并粘贴github中提供的命令。 git remote add origin https://github.paypal.com/Slydon/nameYouWantForYourProject.git git push -u origin […]