Tag: 代码

流行的Swift iOS图表库

大多数iOS开发人员正在学习中,或者现在正在Swift中进行全面开发。 我想快速汇总一下令人难以置信的code.com上三个评分最高的Swift iOS图表库。 这些是根据受欢迎程度,各种图表和功能选择的。 图表 流行的且恰当命名的Charts是一个很好的起点。 使用iOS,tvOS和OSX的Swift编写。 但是,值得注意的是该演示项目位于目标C中。 该库为我们提供了8种不同的图表类型: 线,条,组合,饼图,散点图,烛台,气泡和雷达 还有很多选择,例如 在两个轴上缩放(触摸手势,单独轴或捏缩放)。 使用触摸手势和组合图(线,条,散点图,烛台,气泡)进行拖动/平移。 可自定义的轴(x轴和y轴)和突出显示值(具有可自定义的弹出视图)。 将图表保存到相机胶卷并导出到PNG / JPEG。 图例是自动生成的,但也可以自定义。 2.汇票 这是适用于iOS的高度可定制的图表库,包括: 条形(普通,堆叠,分组,水平,垂直) 散点图,直线(直线/三次/自定义路径生成器) 面积,气泡,多轴。 蜡烛。 一切都是可自定义的,例如颜色,视图,单位,标签,动画,交互,轴等。 使用叠加层,信息视图等,可以轻松创建任意标记。 它使用模块化架构,应该可以轻松创建新的图表类型或添加效果。 3. PNChart-Swift-这是原始PNChart目标C库的快速版本。 它具有一些不错的动画并支持: 酒吧 线 雷达 馅饼 散点图。 如果您对此列表有任何补充,请联系我们,让我们知道。

Swift:forIn和forEach循环!

Swift提供了各种类型的循环进行迭代。 即使对于正在学习编程语言的新开发人员,也很容易理解和使用。 在这里,我想描述两种类型的for循环 ,乍一看似乎很令人困惑。 它们的工作方式相似,但是两者之间存在一些基本差异。 我在WordCount对象的函数中都尝试过。 下面是操场的快照。 如果您在操场上方看到直升机视图,则表明这两个for循环之间完全没有区别,以访问或循环访问数组的元素。 这是使用forIn和forEach的两个区别! 1)您不能使用break或Continue语句退出当前的闭包调用或跳过forEach循环中的后续调用,但可以在forIn循环中执行此操作。 2)在ForEach循环中使用return语句仅针对闭包中的当前调用退出,不会跳过后续调用,但ForIn循环也退出所有后续后续调用。 和上面的操场一样, forEach跳过了单词“ two”的打印语句的执行,这意味着它不会超出printByForEach函数。 而forIn跳过了所有随后的print语句的执行,这意味着它不在printByForIn函数中。 快乐编码,继续!!!

Swift UI动画库Ramotion

Swift UI动画库 由@ramotion开发的Swift库,UI组件和自定义动画的精选列表 有关更多详细信息:-https://github.com/Ramotion/swift-ui-animation-components-and-libraries 内容 折叠单元 折叠单元是一个内容不断扩展的单元,其动画灵感来自于折叠纸卡材料设计。 动画标签栏 Animated Tab Bar是一个Swift UI模块库,用于向iOS Tabbar项目和图标添加动画。 扩大收藏 Expanding Collection是一个动画的材质设计UI卡监视/弹出控制器。 圆形菜单 圆形菜单是一个简单,优雅的UI菜单,具有圆形布局和材质设计动画。 纸开关 Paper Switch是一个Swift材质设计UI模块,在打开开关时会在父视图上绘制。 纸上入职 iOS库Paper Onboarding是用Swift编写的材质设计UI滑块。 卷盘搜寻 Reel Search是一个Swift UI控制器,可让您从列表中选择选项。 导航堆栈 Navigation Stack是一个具有堆栈建模的UI导航控制器的库。 自适应标签栏 自适应TabBar是一个“递减”模块,用于将自定义状态添加到本机或自定义UI元素。 预览过渡 预览过渡是带有动画过渡的简单预览库UI控制器。 滑行集合 滑行集合是UICollectionView Swift Controller的平滑,流畅,可自定义的决定。 流体滑块 带有弹出气泡的滑块小部件,该弹出部件显示在Swift上编写的所选精确值。 伸长率预览 延伸率预览是用于iOS的优雅的UI推式样式视图控制器。 花环景观 Garland View在多个内容列表之间无缝过渡。

了解iOS应用的代码签名

如果您是iOS开发人员,则很可能必须处理代码签名。 而且,如果您是初级iOS开发人员,则开发人员门户网站“证书,标识符和配置文件”部分中的所有操作可能会让您有些不知所措。 本文的目的是帮助初级iOS开发人员更深入地了解代码签名。 这不会是有关如何对应用程序进行代码签名的分步教程。 理想情况下,阅读本文后,您无需进行任何教程即可对应用程序进行代码签名。 我不打算讨论更底层的细节,但我们将讨论一些有关非对称密码的问题。 非对称密码学 您需要了解的最低要求是,非对称加密使用公共密钥和私有密钥 。 用户必须保留自己的私钥,但可以共享公钥。 使用这些公钥和私钥,用户可以证明自己确实是他本人。 可以在此处找到有关非对称密码学的很好的高级说明。 如果您想了解实施细节或背后的数学知识,可以在线找到它们。 应用程式编号 应用程序ID是应用程序的唯一标识符。 它由Apple生成的团队ID(您对此没有任何控制权)和应用程序的包ID(例如com.youcompany.yourapp )组成。 还可以有通配符应用程序ID: com.yourcompany.* 。 这些将在多个捆绑ID上匹配。 通常,您将拥有一个明确的应用ID,而不是通配符。 证明书 您可能已经注意到,要在Apple开发人员门户中创建证书,您需要上传证书签名请求。 您可以从钥匙串生成此CSR,并且此CSR包含私钥。 然后,在开发人员门户上,您可以使用此CSR创建证书。 证书可以有多种类型。 最常见的是: 开发(iOS应用程序开发)—您需要那些应用程序才能在Xcode的设备上运行您的应用程序。 分发(App Store和Ad Hoc)—您需要那些人才能通过App Store或Ad Hoc分发您的应用 APNS(Apple推送通知服务)—您需要那些能够将推送通知发送到您的应用程序的服务。 与开发或分发证书不同,APNS证书与应用程序ID关联。 有两种类型的APNS证书,用于开发-Apple推送通知服务SSL(Sandbox)和用于生产-Apple Push Notification服务SSL(沙箱和生产)。 如果要使推送通知在调试和分发版本中均起作用,则需要创建它们两者。 设备 每个会员年度每个产品系列最多可以向您的帐户添加100台设备。 100部iPhone,100部iPad,100部iPod Touch,100部Apple Watch和100部Apple TV。 要将设备添加到您的帐户,您需要添加其唯一的设备ID。 您可以在Xcode或iTunes中(比较复杂)轻松找到它。 您可以在此处找到有关如何向您的帐户添加设备的详细指南。 供应配置文件 配给配置文件是将App ID与证书以及(为了进行开发或临时分发)与某些设备相关联的内容。 您可以在Apple开发人员门户上创建配置文件,然后将其下载到Xcode中。 用法 创建所有这些文件之后,您可以转到Xcode,添加证书,刷新配置文件,然后选择所需的配置文件。 […]

从行程到小部件

Skyscanner应用程序动态结果页面的故事 由Zsombor Fuszenecker 到目前为止的故事… 在Skyscanner,我们会不断地在我们的应用程序上进行迭代,以帮助旅行者找到适合您旅行的最佳航班,酒店或租车服务。 毫不奇怪,搜索结果页面是应用程序最重要的部分之一。 这是我们的用户将大部分时间用于比较结果和更改搜索参数的地方。 最初,航班搜索结果页面仅用于显示航班行程。 但是,在发布具有以下结果列表的新版本的应用程序后,我们意识到可以改进来自同一提供商的具有多个选项的路由。 请注意,上面的结果非常相似(相同的承运人,价格相差不大,飞行时间略有不同),并且像这样的列表在小屏幕上显示有大量物品并不容易浏览。 我们的目的是使比较变得简单,因此我们最近修改了此页面的外观,以确保比较飞行选项在尽可能小的屏幕上进行浏览。 我们迅速从了解问题转向研究可行的解决方案,然后迭代许多原型。 最后,我们认为我们找到了最佳解决方案:我们没有显示具有很多直航的航线的几乎相同的航班列表,而是按航空公司对列表进行了分组。 通过这样的概述,可以很容易地比较直接承运人及其价格。 我们称这个额外的内容为小部件 。 随着时间的流逝,我们想要添加到结果列表中的事物数量越来越多。 警告消息,推荐小部件和赞助广告只是结果列表中许多其他项目的一部分。 每次我们添加新类型的内容时,更改应用程序的代码都不是一件容易的事。 有一个巨大的文件,其中包含许多条件和边缘案例处理逻辑。 我们还想进行试验,这意味着我们的数据源甚至充满了条件。 创建新的小部件时,开发人员必须经过数百行的If语句。 没有我们的全力支持,一切都容易被打破,其他团队也无法做出贡献。 因此,在意识到我们无法在结果列表上进行足够快的迭代之后,我们开始计划在其背后的新架构。 设计目标: 快速迭代新的小部件并使其更容易进入列表 最小化创建新小部件会破坏另一个小部件的风险 使实验变得容易; 添加新的小部件应该不难,也不需要列表后面的团队的全面支持。 可以并行或顺序运行小部件计算代码。 使列表在后端可配置,以便独立于应用发布周期发布 我们称该项目为“ Widgetify”。 从构思到生产: 我们的第一步只是绘图。 我们自己坐下来,做了一些建筑草图。 然后我们提出了自己的想法,并达成了团队共识。 在初步感觉到“它在理论上可行”之后,我们创建了Feature标志并将其推到我们的主分支(尽管我们并未在生产中启用该功能,甚至在内部也未启用)。 然后,我们创建了基类,其中第一个调用端口是显示默认内容的列表。 我们能够对列表进行过滤和排序,所有内容(甚至分析)都可以像以前一样工作。 在此阶段,我们默认情况下在内部启用此功能,以便尽快捕获错误 接下来,我们创建了一些虚拟小部件,并确定了该项目可以证明未来。 有时,我们发现一个旧的小部件无法在新平台上正常工作,因此我们不得不关闭该功能并修复该特定的小部件提供商(在Skyscanner,我们现在每个平台执行2周的发布周期)。 最终,当我们觉得有东西要向其他人展示时,我们开始在内部推广该平台并收集其他团队的反馈。 为此,我们在团队旁边坐了三天,帮助他们创建自己的内容。 作为回报,我们获得了宝贵的反馈,并且基于集体反馈,我们反复进行以使构建新内容变得更加容易。 卡和提供者 Widgetify的工作方式如下:我们要在列表中显示的所有新内容(卡片)类型都必须具有provider 。 我们可以基于功能标记注册此提供程序以启用内容类型。 但是提供商并不总是需要退回卡。 例如,如果您是美国公民或永久居民,或者您位于美国境内,则只有在您的旅行符合美国政府批准的十二个类别之一的情况下,才可以前往古巴。 这是法律要求。 我们在每次搜索时都会启动Cuban警告提供程序 ,但是,只有在搜索条件和用户符合条件时,它才会返回一张卡片。 […]

在iOS和tvOS应用程序之间共享代码:比您想象的更普遍的基础

有比您想象的更多的共同点-重复使用,复制,回收以更快地进行成本节约型开发 如今,很难想象没有所有通讯设备的生活。 我们每天都在手机上看电视,讲话,发短信和发送电子邮件,和/或在计算机和游戏机上播放最新的视频。 如今,电视平台运营商意识到,他们的订户越来越多地要求他们必须通过电视和电视机轻松访问自己喜欢的在线和移动功能-所有在“非电视”设备上非常熟悉的“转到”应用,工具和娱乐频道-机顶盒(STB)。 因此,他们将投入数百万美元和欧元,以努力满足消费者的需求,并将这些服务作为独特而有吸引力的产品的一部分提供给观众。 面对日益激烈的竞争,电视服务提供商将竭尽全力在任何地方设法保留并进一步扩大其市场份额并战胜竞争的产品推出。 节约时间和投资的一种策略是,如果可能的话,尝试复制和重用已经建立的开发。 各地的开发团队都在尽力避免重新发明轮子。 可应用于多个设备平台而不是仅与一个设备平台兼容的开发活动正在变得越来越普遍。 从纯移动世界重用,复制和迁移创新以使电视应用开发环境受益的可能性比起初看起来的要大。 例如,第四代Apple TV于2015年10月发布,对于那些向消费者提供视频,音频和其他内容的公司而言,这是非常重要的日子。 您可能会问:自从2007年1月以来所有Apple TV投放市场之后,为什么这种迭代如此重要? 答案是因为只有第4代Apple TV附带了新的操作系统tvOS,并带有关联的应用商店,允许用户在其上安装第三方应用程序。 为新平台创建自己的品牌特定应用程序的新可能性促使公司开始考虑使用iOS和macOS将现有解决方案快速迁移到tvOS的策略。 他们的关键问题是:是否可以在iOS和tvOS之间共享代码库? 他们之间的差异揭示了这个问题的答案。 iOS和tvOS之间的最大区别是对用户交互的处理。 iOS服务是通过多点触控技术操作的,而对于tvOS,则是远程控制的。 苹果公司在UIKit中有一个名为“ 焦点引擎”的特定系统,可以在屏幕上的内容项之间进行导航。 正如Apple产品文档所解释的那样,大多数iOS框架也可以在tvOS中呈现,但是对于其中某些API来说,API有所限制。 这些限制通常与UIKit框架有关。 例如,某些类不存在(即,UIStatusBar,UIInterfaceOrientation,UIWebView,UISwitch等)。 另外,UISearchBar没有公共初始化程序,只能使用UISearchController创建。 此外,类的某些属性也不包括在内(例如,UIScrollView — scrollToTop,UITableView —eparatorStyle,UIViewController — preferredStatusBarStyle等)。 但是,尽管有这些框架的限制,但它们仍在tvOS中提供,我们可以在应用程序模型中使用相同的类,此外,我们还可以轻松共享视图代码和视图控制器。 有几种主要的方法来组织针对iOS和tvOS目标的开发: 具有共享代码链接库的单独项目; 工作区,包含共享代码的项目,iOS和tvOS目标的项目以及链接设置; 具有多个目标和条件编译的单个项目。 让我们分析每种方法。 带有链接库的单独项目 •干净的代码 •更少的构建时间(框架已经编译) •即使对共享代码进行很小的更改也将需要大量时间 2.工作区,包含 共享代码 的项目 •易于更改共享代码 •增加了构建时间 •增加使用共享代码解决项目中冲突的时间 3.具有多个目标和条件编译的单个项目 •易于维护 •不像第一种和第二种方法那么干净,因为共享类与特定于平台的实现放置在同一位置 所有这些方法都是有效的,但是对于需要积极发展新功能且时间紧迫的项目,最大限度地减少运营损失非常重要。 在这种情况下,进行有条件编译可以满足多个目标的单个项目是最好的方法。 为了确保项目的结构合理,并避免可能引起混乱的混乱,您需要定义一系列代码分隔规则: […]

模仿Haskell的列表模式

阅读之前,请注意,无需具备Haskell或函数式编程的先验知识。 文章 最近,我一直在试验Haskell,尤其喜欢一种功能-列表模式匹配中的(x:xs),其中x是当前元素,即所谓的“ head”,而xs是其余元素列表,即所谓的“尾巴”。 下面是一个示例,其中包含提到的功能,即列表的长度方法: 话虽如此,我开始怀疑用另一种语言实现此功能是否有用。 下一个代码段是尝试在Swift中“模仿”它: 如您所见,这两种方法都是“ Array”类型的扩展。 我称之为第一个(因为无法给出更好的名称)递归,它返回一个由可选元素(称为x)组成的元组,而数组的其余部分称为xs。 X是可选的,因为在某个时候可能还没有实际的元素。 它的身体是不言自明的:self.first是当前的头,self.dropFirst将返回“尾巴”。 但是,dropFirst的返回类型是ArraySlice而不是Array,因此是map方法。 现在,在某种程度上模仿了Haskell的功能,可以实现它的长度。 一般情况是返回1加上当前“迭代”末尾使用长度的结果,请参见示例2,l。 9.上面两行是列表为空并返回0或head元素不存在的情况,这意味着它等于null并仅返回1。 尽管它的实现方式不如Haskell中的原始方法那么优雅,但它可以在某种程度上对我产生吸引力。 我自己,我真的没有看到像Swift这样的语言进行递归的优势,我的一些认识Swift的朋友也没有。 但是,这可能是一种吸引人的设计模式。

有趣的位掩码

有很多类型检查方法。 您可以将其定义为常量字符串以供日后检查,也可以使用enum进行便捷的方式(这种方式最多可以使用)…但是有一种类型检查的方法,即使用Bitmask 。 本文将引导您深入了解如何在Objective C中使用Bitmask 。 我们可以很容易地看到,Apple在SDK中使用了大量Bitmask ,例如: UIViewAutoresizing , UIInterfaceOrientation … 我们将创建自己的示例,让我们看看: typedef NS_OPTIONS (NSUInteger,PLandayEngineerTeam){ PLandayEngineerTeam_Mobile = 1 << 0, PLandayEngineerTeam_Backend = 1 << 1, PLandayEngineerTeam_Frontend = 1 << 2 }; 我们实际上使用了按位运算符,在这种情况下称为“ 移位” ,因为在此操作中,数字被移动或移位 。 在我们的示例中,数字向左移动。 欲了解更多信息,您可以查看一下有关位操作的信息:https://en.wikipedia.org/wiki/Bitwise_operation 因此,现在我们在Binary中提供示例: typedef NS_OPTIONS (NSUInteger,PLandayEngineerTeam){ PLandayEngineerTeam_Mobile = 1 << 0, // => 00000001 PLandayEngineerTeam_Backend = 1 << 1, […]

贴在屏幕底部的视图

今天,我们将看到如何将视图固定在屏幕底部。我们使用自动布局的程序化方法。 首先,我们创建带有一些文本的标签,例如“离线模式”。然后,将其放置在屏幕底部。 var lblOffline = UILabel() 然后在viewDidLoad()方法中,将视图添加到屏幕底部。 fileprivate func setupName(){ 令高度= CGFloat(50) //设置标签属性 lblOffline.text =“离线模式” lblOffline.backgroundColor = .red lblOffline.textAlignment = .center //步骤1 lblOffline.translatesAutoresizingMaskIntoConstraints = false //第2步 view.addSubview(lblOffline) //步骤3 NSLayoutConstraint.activate([ lblOffline.leadingAnchor.constraint(equalTo:view.safeAreaLayoutGuide.leadingAnchor), lblOffline.trailingAnchor.constraint(equalTo:view.safeAreaLayoutGuide.trailingAnchor), lblOffline.topAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor,常数:-height), lblOffline.bottomAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor), ]) } 就是这样做的。 谢谢阅读。 请感觉是否有任何疑问。 如果您喜欢这个,请鼓掌并支持我。

Swift中的功能组合

数学中一个非常有趣的概念是函数合成 ,正如名称所暗示的那样,它允许将两个函数合成。 用数学符号表示,可以写如下的方程式 f-> x:x * 3 g-> x:x + 4 h-> x:f。 G h(5)= 27 总结起来,这意味着放在组合函数中的x值将首先在右边服务该函数,并且其结果将用作左边函数的参数。 Haskell是一种可以充分利用后者的编程语言,下面是一个示例: 所以, 将返回13。 但是我们如何在Swift中实现函数组合呢? 让我们使用游乐场看看! 优先级组的唯一用途是使我们后面的“°”中缀运算符保持关联。 …函数的签名非常有趣,让我们来看一下。 我们有三种通用类型-T,U和V。我们的第一个参数f1接受一个函数,该函数接受U并返回V。但是,第二个参数f2接受一个函数,该函数接受T并返回U。我们的返回类型为一个函数本身,它采用T,因此为f2的自变量,并返回V,因此返回类型为1。这是正确的,考虑到如何在顶部解释函数的组成。 由于我们的返回类型将是一个函数,因此我们必须能够插入一个值,因此,我们是否必须使用闭包,这将说明返回后的花括号。 将要输入的值称为x,然后将我们的函数放在一起:f1取f2,x取x。 我们定义了以下两个函数,以便可以测试组成,最后一个表达式表明它有效。 我们完成了,看起来不是很优雅吗?