Tag: swift

[教程]如何使用ABVideoRangeSlider在iOS中修剪视频-第1部分,共2部分

本教程由Swift 3使用ABVideoRangeSlider库制作。 在此示例中,我们包括了一个简单的视频播放器。 此示例托管在我们的Github存储库中! 创建项目 让我们使用Single View Application模板创建新项目: 我们称之为视频编辑器 准备用户界面 首先,让我们创建视频播放器。 转到您的Main.Storyboard并添加一个UIView 并设置约束 并添加两个按钮:播放和暂停 将这些按钮连接到您的ViewController.swift: @IBOutlet var btnPlay:UIButton! @IBOutlet var btnPause:UIButton! 与包含我们视频的UIView相同 @IBOutlet var videoContainer:UIView! 将视频添加到我们的项目 将视频拖放到项目导航器中,在这种情况下,我正在使用mp4视频。 并确保检查是否需要复制项目以及项目的目标 。 转到您的ViewController.swift并在ViewDidLoad方法中添加以下行: let path = Bundle.main.path(forResource:“ test”,ofType:“ mp4”) 现在,为了播放该视频,我们需要将AVFoundation导入到我们的控制器中: 导入AVFoundation 并将这两个属性添加到我们的控制器中: 让avPlayer = AVPlayer() var avPlayerLayer:AVPlayerLayer! 初始化AVPlayer和AVPlayerLayer 取得视频的路径后,我们需要创建一个AVPlayerItem 使用该路径,并初始化avPlayer : 让playerItem = AVPlayerItem(URL:URL(fileURLWithPath:path)) avPlayer.replaceCurrentItem(with:playerItem) 并设置我们的avPlayerLayer : avPlayerLayer […]

可选值

在学习的第一天,我遇到了前所未有的编程功能。 var x:Int? = y 可选值可以是普通变量或nil。 我认为这很棒。 在其他语言中,是否可以将变量假定为非null尚不明确。 程序员必须记录API是否可以返回null。 如果另一个程序员碰巧忽略了可能会形成一个困难的错误。 Swift明确指出了这一点,从而减少了错误并提高了开发效率。 为什么不在任何地方? 在了解了可选值之后,我回顾了数组。 在快速数组中,仍然抛出索引超出范围的异常。 这使我产生疑问 为什么数组索引不返回可选值? 我认为最好返回nil而不是抛出异常。 可能有一个很好的理由。 将来,我将学习何时最好返回null以及何时最好引发异常。

iOS安全区

是否想为iPhone X更新应用程序损坏的UI,但不知道如何? 本文将帮助您理解和回答您的疑问。 在iOS 7中,Apple引入了topLayoutGuide和bottomLayoutGuide作为UIViewController的属性。 他们允许您创建约束以防止内容被UIKit栏(如导航栏,状态栏或标签栏)隐藏。 现在,它已被iOS 11中的“安全区域布局指南”所取代。如果您想进一步了解这些区别,请查看下面的链接 https://useyourloaf.com/blog/safe-area-layout-guide/ 安全区域布局指南:该布局指南表示视图的未被栏和其他内容遮挡的部分。 最初,当视图在屏幕上不可见时,布局向导的边缘等于视图的边缘。 本指南反映了导航栏,选项卡栏,工具栏和其他祖先视图未涵盖的视图部分。 视图一旦出现,它就会自动更新约束,这对我们来说是很大的好处。 下面的示例将帮助您了解如何有效地使用安全区域布局指南。 以下代码段显示了使用《安全区域布局指南》创建布局: 有2种使用SafeAreaLayoutGuide的方法:与topAnchor的equalTo或constraintEqualToSystemSpacingBelow对齐。 当我们使用ConstraintEqualToSystemSpacingBelow时,两个锚点之间的距离是通过将系统空间multiplier参数中的值来确定的。 系统空间大部分时间为8像素,这也取决于其他因素。 例如。 如果锚点表示文本基线,则间距由这些基线处使用的字体确定。 下面的代码片段显示了使用“安全区域插图”创建布局: 如果扩展工具栏或导航栏,我们可以使用`additionalSafeAreaInsets` 感谢您阅读本文。 如果您发现这篇文章对您有所帮助,请别忘了鼓掌。

蒸气3发布时间表

服务器端Swift框架Vapor的最新版本即将完成! 在考察Swift 4.1及其对蒸气的影响时,我们决定与Swift 4.1一起发布3.0。 这意味着我们无法给出具体的发布日期(除非Apple发布了发布日期)。 但是,我们已经决定了适用于早期采用者的GM(候选发布)版本的具体发布日期。 斯威夫特4.1 Swift 4.1是Swift最大和最佳的“ .1”版本之一。 头条新闻当然是条件一致性。 Vapor团队(在字面上)一直在焦急地等待着这一点。 尽管此功能将在4.1中发布是一个好消息,但它确实对Vapor 3造成了问题。条件一致性对我们框架的核心有很大影响-它不是纯粹的累加更改。 使用Swift 4.1进行编译时,我们过去用来解决Swift 4.0中没有条件一致性的hacks将会失效。 要让Vapor 3与Swift 4.0和4.1一起使用,将意味着在我们最关键的代码区域中会有大量的#if swift(>=4.1) / #else / #endif宏。 此外,macOS安全性库中的一个严重错误已阻止Swift 2.1编译了我们的HTTP / 2代码。 这意味着我们可以依靠4.1发行带有本地HTTP / 2支持的Vapor 3。 考虑到这些问题,我们认为最大程度地减少错误,混乱和维护人员时间的最佳选择是只需要Swift 4.1。 可以从Swift.org快照站点下载适用于macOS和Ubuntu的Swift 4.1。 不需要Xcode 9.3 beta。 很快,Vapor 3的beta分支将开始依赖Swift 4.1。 Beta.1 Beta.1发行版将于2月9日发布,这将是Vapor 3的第一个带有完整标签的发行版(其正确存储库中的模块)。 这将意味着大大提高稳定性,因为您必须通过修改Package.swift文件来选择加入更新(仅swift package update不会破坏您的代码)。 此外,在2月9日之后,打破变更必须是考虑合并的关键问题。 我们希望教程作者在此之后开始发布早期的Vapor 3内容(包括精彩的Ray Wenderlich备受期待的视频系列)。 这将是开始试用Vapor 3的好时机。对于软件包维护者来说,这将是更新软件包的好时机。 […]

快速提醒Swift中的SOLID原则

如果您开始从屋顶盖房子会怎样? 墙壁易碎,倾斜角度,基础不稳定。 这样的房子寿命不长。 该应用程序具有相同的趋势,并取决于开发人员的资格。 在我们的领域中,砖是一种编程原理,对系统有不同的影响。 我认为SOLID是基本级别。 本文的目的是在Swift中提供快速指南或知识更新。 让我们用好与坏的情况来解释该缩写: 1. 单一责任 -每个对象应仅对一种责任作出响应。 换句话说,概念模块/类/结构必须响应一个动作。 单一责任-流程不畅 单一责任-流动性好 在这里,我们仅处理OrderType数据,并且可以在没有任何其他条件的情况下对其进行更改。 2. 开闭式 -实体必须开放以进行扩展,但必须封闭以进行修改。 打开关闭 –   流量不好 在我职业生涯的初期,我将更改内部功能,并且可能在数据库处理以及将现有数据相互之间导出时遇到问题。 开闭式-流动性好 更好的方法是在OrderStorage下创建子类并重写方法或准备协议,然后在OrderStorage实现正确的数据处理。 换句话说,我们无需内部修改即可扩展存储功能。 3. Liskov替换 -任何对象都可以由其子对象替换,而无需更改应用程序设置。 简单地说,如果我们将基类更改为其子应用程序,则该子应用程序将保持稳定,并且新问题不会对其他部分产生影响。 Liskov替代-流动不畅 在那里,我们违反了LS原理。 我们通过添加以下条件来更改保存功能: order.products必须具有计数验证。 基本RealmOrderStorage不会这样。 有两种解决方案: 向基类添加新参数(也更改协议) 更改NewOrderStorage类的保存接口。 Liskov替代-流动性好 在这里,我们不违反基类接口的契约,并且可以在任何地方使用新的子类代替它。 Swift的一项强大功能是面向协议的程序设计,我们可以在不进行子类化的情况下进行工作,但可以通过合同支持设计。 4. 接口隔离 -许多专用接口比一个更好。 它们既大又通用。 它有助于在使用的项目中划分功能的不同部分,并且不会在那里实现不必要的方法。 转到我们的示例: 接口隔离-流量不良 在这里,我们有几种与产品相关的其他方法。 那些没有折扣或尺寸设置的产品该怎么办? 我们可以陷入陷阱。 接口隔离-良好的流动 在这里,我们可以使用基本接口ProductType进行操作,并根据需要设计其他实例。 5. 依赖倒置 […]

扩展和管理开源社区

我已经为开源iOS社区做出了大约一年的贡献,并参与了诸如MessageKit , Moya , SwifterSwift和IBAnimatable 。 这些项目无疑使我成为了一个更好的iOS开发人员,但是影响最大的项目是Moya,即Moya管理社区的方式。 如果您要构建一个相当大,持久且广泛使用的开源项目,则将需要一些额外的帮助。 与维护实际的代码库相比,通过维护示例文档,管理文档以及响应GitHub问题而积累的工作量可能更耗时。 对于成熟的项目尤其如此,因为代码库的更改频率较低。 我想讨论一下我从Moya中学到的教训,以便围绕一个项目建立一个大型社区,以维护该项目。 有同情心 对开源做出的贡献可能会令人恐惧-特别是对于初次贡献者。 人们常常不愿做出贡献,因为害怕受到批评或看上去无所事事。 不言而喻,您绝不应轻视任何贡献或尝试作出贡献。 您的项目应采用的首批文件之一是行为准则。 Moya遵守《贡献者公约》的行为守则。 如果潜在的贡献者正在努力做出贡献,请采取一切必要的措施来帮助他们完成任务,无论是指导他们完成拉取请求过程还是编写补丁的后备单元测试。 重要的是,每个项目都必须有一份有助于指导的文档,该文档讨论项目的开发过程及其对贡献者的期望。 这样可以确保新的贡献者感到舒适,并使贡献尽可能容易。 您应该总是感到受宠若惊,以至于有人足够关心以帮助您改进项目。 您永远不会知道,将来,该贡献者可能最终为您的项目做出一些最重要的贡献。 提供主人翁意识 绝大多数开放源代码项目都由捐赠时间提供支持。 重要的是,人们在帮助构建的东西上要有主人翁感。 我了解到有几种方法可以做到这一点: 将您的项目托管在组织中。 如果您的项目开始越来越引起社区其他成员的认可,则应高度考虑将所有权移交给组织。 这使您可以在项目周围形成社区,并让其成员在其GitHub个人资料上显示组织徽章。 在第一个合并的合并请求之后邀请用户加入您的项目。 莫亚(Moya)采取了这项政策,并取得了奇迹。 目前,该组织有126个成员,所有成员都对该项目具有写权限。 听起来很疯狂,但是我们锁定了master分支,要求通过状态检查和代码审查。 还没有一个问题。 Moya甚至还开发了一种名为Aeryn的工具来自动执行邀请过程。 您可以在此处查看采用Aeryn的其他组织的列表。 不要使用您自己的名称采用项目前缀。 建立成功的项目是团队的努力。 您应该避免使用引用您自己的名称的项目前缀或采用任何其他种类的个人品牌。 它暗示您是该项目的唯一所有者,并减少了其他贡献者的价值。 就个人而言,我不会使用此命名约定来涉及项目。 通过表彰杰出贡献者为核心团队来奖励他们。 所有贡献者都是宝贵的,但是不认识那些特别致力于维护项目和长期健康的人是错误的。 这可以像在GitHub组织内创建核心团队一样简单,也可以通过在正式文档中收集贡献者的姓名来实现。 尽管每个项目都有不同的要求,但您可以参考Moya如何确定核心团队成员及其职责。 分配责任 根据Ash Furrow的说法:…开源维护者应尽早分配其权力和职责。 因为事实是,最终您将准备好进行下一个项目。 作为维护者的目标实际上应该是创建一个对您的兴趣超过其兴趣的项目。 作为一个控制狂,这对我来说很难。 但是,在开发MessageKit时,我真正地了解了这一点的重要性。 最近,我因积极从事该项目而精疲力尽,以至于我停止了将近一个月的捐助。 在我缺席之前,我已经将制作新版本的权力分配给了前两名贡献者,然后返回发现他们已经修复了多个错误,提供了新功能,甚至发布了重要版本。 视力 […]

与我们一起建立您的职业生涯:iOS工程师

UPD:空缺暂时关闭,但我们不介意您是否将简历发送给我们! 我们正在缓慢地推出空缺职位,并计划 很快 找到多达5位新的迷人的人 (QA, DevOps ,产品经理和Ruby Dev) 在Lviv办公室合作。 而且,如果您在这里-表示您喜欢开玩笑(这已经很好了😉 我们的目标是制造能够确保挪威媒体与时俱进的产品,并找到新的收入来源。 这意味着您将与提供内容的挪威当地报纸和其他组织合作。 此外, 我们与挪威的一些很棒的初创公司合作进行研发 。 那么,我们需要谁? 1. iOS工程师 这个iOS职位将适合经验丰富的工程师,他曾经尝试过很多事情,现在正在寻找一个像家庭一样的团队,愿意介绍自己的想法。 您需要了解什么才能完成这项工作: 另外,如果您之前至少已将2–3个iOS App运送到应用商店或有活跃的GitHub帐户/开源贡献,那么这将是一个巨大的好处。 总体职责: 基本上就是这样……但是…… 我们猜您现在正在思考: “伙计们,嗯,我为什么要和你一起工作? 我不认识你。”🤔 相互了解不是一个容易的过程,但是即使在实时与我们会面之前,您也可以做到: 阅读与人们的访谈,建立我们的公司 ; 在Instagram幕后潜入我们的生活高峰或查看#innocode ; 来参加考试,看看真实的我们! 如果听起来像您,我们很乐意回答您的问题,只需给我们的首席运营官Ira Nahorna留言-ira (at)innocode.no,然后参加考试! 希望早日收到你的消息! Innocode家族😉

使用UIAlertController显示警报的简单示例

好吧,今天我将介绍UIAlertController,几乎可以肯定的是,使用iOS(Swift)制作应用程序时将实现该UIAlertController。 众所周知,iOS 8已弃用UIAlertView,并且出现了UIAlertController。 当您开始开发iOS时,我认为您每次显示警报时都经常编写类似的代码(尽管可能不存在…) 这次,我介绍使用此类UIAlertController的简单实用程序类。 尽管称为UIAlertController的模式也多种多样,但在这里我以普通标题,消息内容,Cancel,OK组成的模式为例进行介绍。 实现此方法时,常规方法如下所示。 let alert = UIAlertController(标题:“默认样式”,消息:“标准警报。”,preferredStyle:.alert) alert.addAction(UIAlertAction(title:“ OK”,样式:.default,处理程序:nil)) alert.addAction(UIAlertAction(title:“ Cancel”,样式:.cancel,处理程序:nil)) 目前(警告,动画:正确,完成:无) 例如,每次显示警报时都编写类似的代码很痛苦。 因此,我将常见的Cancel,OK格式总结为实用程序类。 daihase / iOS_Sample 通过在GitHub上创建一个帐户为iOS_Sample开发做出贡献。 github.com 我在iOS_Sample存储库中创建了一个简单的示例项目UIAlertControllerSample。 使用很简单。 只需在要显示对话框的位置进行调用,如下所示。 ViewController.swift 让alertTitle =“标题” 让alertMessage =“ message1 \ nmessage2” 让positiveButtonText =“确定” 让negativeButtonText =“取消” Util.sharedInstance.showAlertView(title:self.alertTitle,消息:self.alertMessage,actionTitles:[self.negativeButtonText,self.positiveButtonText],操作:[ {()->()在 打印(self.negativeButtonText) }, {()->()在 打印(self.positiveButtonText) }] ) Util.swift(作为参考,这是一个总结为Util的UIAlertController) 导入UIKit Util类:NSObject { var rootWindow:UIWindow! // Singleton。 类var […]

今日扩展(小部件)

? Uma Today Extension,您的小部件,可扩展到其他信息,或用于复制。 快速搜索列出iPhone 6S的零件,使用3D触摸或复制的功能。 可以使用ViewView常规组件的Widget小部件。 Porémele possuilimitaçõesgrandes de processamento,enãoallowe entrada de texto com teclado。 Alémdisso,一个ScrollViews nos小部件的文档建议。 范例 以acordo com为准则,以简单易用的小部件交互方式,作为首选执行命令的通用工具。 一个值得信赖的应用程序示例。 谷歌地图 可以使用Google Maps widget或wi pos usa maipróximoalocêteàlocalizao ponto deônibusmaisfrequência,或按实际速度进行操作。 速度 暂时保留所有小部件的权利,请以最及时的方式恢复。 努班克 您可以在Nuban te mostra de maneira be s简单部件中工作,也可以在balançoda sua conta中获取信息。 科莫criar um小部件? 1º—没有Xcode的Criar um projeto Abra Xcode e Crie um Novo Projeto […]

另一则文章解释了iOS中的协调器

这个帖子是给谁的? 这篇文章是针对中级iOS开发人员的。 您应该熟悉UIKit框架,委托,面向对象的编程和Futures / Promises。 这篇文章不适合初学者。 什么是协调员? 协调器是一类,其职责是在应用程序中执行用户的操作。 这意味着什么? 假设您的应用程序有一个登录屏幕: 以下是描述典型登录的一系列事件: 用户填写电子邮件和密码文本字段 用户点击登录按钮 用户点击“登录”按钮后,可能会发生以下两种情况之一: a)成功的登录事件 b)登录事件失败(电子邮件或密码无效/请求超时) 协调员负责执行成功的登录事件或失败的登录事件。 协调器如何帮助应用程序的体系结构? 首先,协调器模式显着减少了UIViewController文件中的代码行数。 它可以消除Massive View Controller综合症。 UIKit赋予了UIViewControllers如此强大的功能和责任,使用400多行代码创建UIViewController文件非常容易。 在每个iOS开发人员的职业生涯中,他/她都会在他/她创建或继承的代码库中遇到此问题。 根据个人经验,去年,当我被聘为Jr. Application Developer从事我的第一份专业工作时,我被立即负责创建应用程序。 使用标准的Model-View-Controller(唯一的一种控制器是UIViewController),快进了两个月,我创建了一个代码库,其中每个UIViewController文件的长度至少为600行或更多,而AppDelegate文件的长度为1300行( y!) 这可能发生在Jr. Developer的职业生涯中的某个时刻,这没关系。 协调器消除了Massive View Controller综合症,因为在代码库中使用它时会发生两件事: 协调器代替UIViewController承担导航的责任 协调器成为对象(协调器的委托)彼此交互的地方。 (这些代表进行诸如联网,将数据持久保存到磁盘,根据从API获取的数据创建特定于应用程序的数据模型等操作)。 这两件事的技术定义是: 它负责在其管理的UIViewController上进行导航方法调用 成为发生委托方法调用的中心 这是否违反了单一责任原则? 我认为事实并非如此。 为什么? 因为协调员执行用户的操作。 它的唯一职责是执行用户的操作。 这并不意味着它应该直接与API交互或将数据转换为类的特定于应用程序的实例(例如User类)或直接写入数据库。 它应该将那些进程分别委派给其他对象,例如APIManager或UserService或RealmManager。 协调器直接管理导航,这意味着它在所管理的UIViewController上调用诸如present(viewController:)之类的方法。 另外,协调器还可以管理一系列子协调器(这与导航相关联,因为不同的UIViewController意味着不同的协调器)。 UIViewController会发生什么? UIViewController发生了什么事情,因为它不再了解其他UIViewControllers(除非它具有子UIViewControllers,这是另一个主题)。 它不再担心导航,因为它被委派给其协调器。 它仅专注于管理其视图(监视用户输入,重新排列子视图等)。 它履行其作为视图控制器的角色。 最终结果是大大减少了UIViewController文件上的代码,这意味着更高的可读性。 […]