Tag: iOS App Development

圆形视图布局–丹尼斯·沃尔什–中

我的一个朋友要我帮助她在她正在重写并升级到Swift的现有应用程序上学习自动布局,并添加一些新功能。 该应用程序是夏威夷瓦胡岛上使用的一种教育工具,旨在帮助孩子们对学习环境产生兴趣。 我们准备更新Storyboard中的许多现有视图控制器,添加UIStackViews并设置约束。 大部分设置都非常简单,我们只需要确保针对新的较大手机尺寸正确更新了按钮,图像和文本视图即可。 该应用程序的主要重点之一是在Hèeia池塘周围,其中包含传感器信息,该应用程序可以显示该信息以向孩子们显示池塘中任何给定时刻的情况。 这是设计的新功能,其想法是在池塘周围有一系列按钮,以指示位于池塘中的传感器。 基本上,我们需要将按钮排列成半圆形,以近似池塘的边缘。 我最初的想法是使用贝塞尔曲线路径在池塘周围创建弧线,然后沿弧线放置视图。 不幸的是,没有一种简单的方法可以访问组成UIBezierPath的点。 关于Stackoverflow有一个答案,但这似乎比我需要的要复杂(但可以肯定地说更准确)。 相反,我选择对高中几何和三角学课进行噩梦般的回忆。 我先要说的是,高中时代对我来说早已不存在,而几何学就我所能达到的程度而言,我做得并不好。 可以说,正是这堂课让我不喜欢数学。 即使我的计算机科学学位三角学需要所有数学运算,也从来没有真正提出太多。 问题似乎比实际上要难得多,实际上是一旦您将注意力放在数学上。 我们都(希望地)记住一个直角三角形的勾股定理:a²+b²=c²。 这与我的旧克星正弦和余弦一起变得非常方便。 如果您有兴趣,可以在这里查看数学,我将跳过它,仅声明如果您有一个圆的半径和一个角度(通常由ThetaΘ表示),则可以使用余弦(Θ)函数和使用正弦(Θ)函数的y坐标。 这给了我们一个简单的公式,可以找到圆上给定点的一对(x,y)坐标。 x坐标=半径*余弦(Θ) y坐标=半径*正弦(Θ) 我想对视图应在屏幕上出现的位置进行可视化参考,因此我使用UIBezierPath创建了一个圆,池塘的左边缘大致充当了圆的中心。 由于自然不喜欢做完美的圆,因此我们的位置将是一个近似值。 我们使用贝塞尔曲线路径绘制对齐圆,并将圆与池塘近似中心的偏移量居中。 这为我们提供了一个很好的参照视图。 接下来,我们使用一个简单的循环对视图进行布局,以计算每个视图沿假想圆放置时Theta(角度)的变化。 由于总共有9个视图和一个半圆(2π是一个完整的圆),我们将π/ 9除以得到每个视图的角度。 我们将180 °除以9,得到的角度增量为20 ° (20 ° ,40 ° ,60 °等)。 我们将初始视图的中心点设置为大约池塘的顶部,并通过增加每个视图的Theta 值并使用余弦和正弦函数更新初始点的(x,y)坐标,将其余视图沿圆以均匀间隔沿圆放置。新Theta作为输入。 这给我们一个很好的平滑的圆形排列。 您可以从代码库布局图像中看到,我们可以很好地近似池塘的外部边缘(足够靠近政府工作),并且使用基于代码的布局,视图将针对不同尺寸的设备(不包括设备旋转)正确调整。 唯一需要注意的是要记住,如果使用自动布局,则直到调用viewDidLayoutSubviews之后才设置基本视图的边界(在这种情况下为背景图像)。 因此,我们不想在viewDidLoad调用我们的方法,而是在viewDidLayoutSubviews调用,否则我们的数学计算将被关闭(基于Storyboard中视图的大小,它们的计算将不正确)。 我们的最终布局为池塘提供了一个近似的外观,并以对称的图案布置了优美的景色。 资源 单位圆—数学很有趣 单位圆—三角函数与几何定义 沿贝塞尔曲线路径放置图像 是否可以在路径周长上对齐视图?

在App Deeplink导航系统中

一开始的需求是这样的。我们希望可以通过某种方式,让用户可以在打开app的时候,直接,空降,跳到某个特定页面上,这特定页面可能是某篇文章,潜水日志,或某张照片,某则留言,然后还要照指定路径上一层退回上一页。所以Deeplink就被提出来,希望可以实现。 参考维基百科。简单说就是,利用一套预先定义好的URI路径,使用户可以恢复重定向到应用内部的特定页面/特定功能,甚至可以重新打开。 用例 投放到应用内的特定文章,特定商品等等指定内容 做新功能的介绍或展示 根据通知逐步到特定位置 你可以做… 在每一个需要重定向的页面处理。在某个地方解析URL转为参数,但在各别页面上处理下一级的替换。 最好的优点应该是直观,当每页的下一级都是有限范围的情况下,或许也很快可以实作完成。但是如果若要重新设置规格会随整个app功能增加,持续不断长大的时候,就有机会让复杂度与修改幅度倍数增长。 而若在每一页处理下一级的话,必须先把本页生出来,表示没处理好的时候用户会看到一页一页的转场跳进去。那么有点不是我想要的样子了。 当我要做的时候 当时,我们除了需要开发深层链接系统之外,原本有一套实作了一半的通知系统,共有8x个不同的通知类型。各有不同的通知消息。整并过后大约可减为2x种替换组合。既然deeplink与notification都需要进行类似的页面重定向,所以就决定,先将notification转换为deeplink,再用转出来的deeplink进行替换,即可使用一套代码处理所有替代行为。 实作DeeplinkHandler,将收到的link解析为路径与参数。 实作ViewControllerFactory,以参数初始化各ViewController而不使用data。 根据解析得到的路径将各个ViewController实体化,组出ViewStack。 在进行引导时,使用UINavigationController setViewControllers将ViewStack推上画面 回头将通知与有效载荷按照规格转换为deeplink格式 在主要行为完成之后,有几个地方可能需要额外处理: 合法的深层链接:当然我们不会希望随便收到什么链接进来通通都拿去去处理,结果不小心踩到坑就崩溃了。我们可以把路径跟参数key定为枚举,在解析时以字符串型别转换做简单的判别。也可以使用特定的schema与主机名作检查。 要求登录:也许有人某个特定页面需要用户登录才能显示内容。我们可以把对应的几个路径存入数组,在组成ViewStack之前,预先检查是否需要登录。 路径之间有相依性:如某个路径代表前一页的特定功能而非独立存在。则可设计简单的状态机,在解析时预做处理 在统整出这一套系统后,往后需要再加入新的页面,也非常容易。开发者只需要注意, 不要将整包资料从前一级画面带入。减少了画面间的相依性,各画面可独立被实体化,就很容易可以加入这个系统。 不需要为了加入deeplink支持,而修改一些很久没有更动的画面。 由于路径之间的关联被解构,甚至可以支持组出超越spec规范,10个重定向页面以上的deeplink,都可以正确克服无阻碍。 终极的嫌疑麻烦,是不怕麻烦。 如果你有个记性还不错的老板,常常喜欢说, 我们不是之前有做过一个什么系统,那现在可不可以拿来套用,这样做起来应该很快吧。 建议您在做新功能的时候,最好可以先考虑一下这个功能有没有可能在未来继续被放大利用。在时间允许的范围内,进行调整向未来兼容的框架或系统,这样才有机会越写越轻松。

投资印度企业幻想板球应用程序的5大理由

在投资方面,许多人都想投资可以为您带来长期利润的业务。 像印度这样的国家几乎在每个领域都面临着激烈的竞争,克服挑战并长期获得收益有点棘手。 该国人民必须具有创新精神和聪明才智,以便他们可以选择有利可图的业务。 因此,对于这些机灵的人来说,幻想板球应用程序是一个很大的优势。 这是在短时间内赚钱的聪明方法。 以下是投资幻想板球应用开发的一些主要原因 适用于印度企业。 板球是印度的激情 在所有类型的游戏中,板球无疑是印度最著名的游戏。 人们对游戏充满热情,并认真对待它。 因此,幻想板球比赛成功的可能性很大。 吸引新客户并赚钱 幻想板球网站和移动应用每天都可以帮助吸引新客户,尤其是在组织板球联赛时。 在该虚拟游戏中,选择玩家并由客户为其虚拟创建的团队支付一定金额。 这样,应用程序所有者就可以赚钱。 由于幻想游戏使板球现场游戏变得非常有趣,因此很多人都喜欢玩游戏。 有可能建立庞大的客户群并赚钱。 较低的竞争 幻想板球比赛的概念在印度是新的。 因此,该领域竞争并不激烈。 如果您忠于自己的业务并且您的应用程序运行良好,那么您可能会在短时间内获得良好的收入。 是合法的 板球幻想门户或幻想板球应用 是印度的法律游戏。 它不属于赌博。 这是一种技巧游戏,被认为是合法的。 这是越来越多的印度人对该游戏表现出兴趣的主要原因之一。 印度的前途一片光明。 各种可能性 每年都会举办各种类型的板球比赛,例如T20,世界杯和IPL。 印度企业有机会开发支持特殊板球比赛的幻想板球应用程序。 这也降低了竞争。 除此之外,还可以创建支持Android或iPhone的游戏。 这些是投资幻想板球应用开发的一些最大优势 在印度。

iOS上的模块化架构以及我如何将构建时间减少了50%。

最近,我被Freelancer聘为iOS工程师,负责他们的核心iOS应用程序。 作为一个年轻,新鲜,进取,积极进取(感谢YouTube激励视频)的大佬,我喜欢编码,我建议我们对该项目进行大约6项改进,以改进它。 更大的问题之一是关于应用程序的编译时间。 当我开始时,清洁后大约花了15分钟。 在这篇文章中,我将描述如何解决如何提高编译时间以及将项目从仅依赖CocoaPods的项目转换为一个分为独立框架组件的项目所经历的过程,我们从中获得的收益以及整个过程过程进行了。 本文部分涉及CocoaPods和迦太基。 对于那些不知道他们是什么的人,我将在这里做一个简短的介绍。 如果您已经熟悉两者,请随时跳过本节。 – CocoaPods https://cocoapods.org/ –迦太基https://github.com/Carthage/Carthage CocoaPods和Carthage都是第三方依赖工具。 它们之间的主要区别是编译以及如何将库附加到项目。 Cocoapods中的Pod是与您的应用程序代码绑定在一起并一起编译的库。 每次您对项目进行清理时,都必须编译所有第三方库。 如果您的项目使用很多库,则编译库会花费大量时间。 迦太基的做法有所不同:它获取库并将其构建到框架中。 然后必须手动集成构建的库。 使用Carthage构建库还需要花费更长的时间,因为它们是针对所有不同处理器架构进行编译的。 但是,无需在项目中进行清理后对其进行重建; 仅当要将库更新到新版本时,才应再次构建库。 应该注意的是,一个库可以被更新而不接触其他所有库。 内置库链接到项目,并在编译后附加到应用程序。 与CocoaPods设置相比,设置Carthage并将所有库链接到项目可能很耗时。 两种工具各有利弊。 通常,CocoaPods库更易于添加,删除和维护,但必须在清理后再次编译。 迦太基的添加,删除和维护更加困难,但是节省了时间,因为在清理项目后不会再次编译所有库。 该项目自2012年以来一直在开发中。我不得不处理大量旧代码,并一路将某些Objective-C类重写为Swift等。但是总的来说,最大的问题是CocoaPods库。 我们大约有80个与该应用程序捆绑在一起的库,这当然花费了大量时间。 不幸的是,由于某些库具有依赖性,尤其是内部开发的库,要摆脱CocoaPods库并不像用Carthage替换库那样容易。 内部开发了80个CocoaPods库中的18个。 例如,Core库处理API和持久性,Components库具有UI组件,而Feature1库当然具有feature1,依此类推。 我对CocoaPods依赖关系图非常不满意,即Core库将Moya,RxSwift,RxMoya,SwiftyJSON等作为依赖关系,而Core库是Feature1库的依赖关系,Feature1库具有自己的依赖关系,如RxCocoa,RxDataSources等。 …下图描述了我们拥有的CocoaPods库的简化依赖关系图。 请从上图中的18个内部CocoaPods库和62个第三方中想象这个概念……那么,仅安装CocoaPods库需要花费一些时间。 您可以通过在内部podspec中添加其他一些依赖关系来轻松地打破树形结构,因为每个内部库都有其自己的podspec,因此很难组织特定第三方库的来源。 这个主意 清洁后编译第三方Pod大约需要6分钟,这是无法接受的。 但是我不能随便用框架版本替换例如Alamofire,因为Moya将Alamofire作为依赖项,因此RxCocoa具有RxSwift等等。 因此,如果我要用其框架版本替换Alamofire,则Moya库将始终下载Alamofire,因为它依赖于它。 最后,我将获得两个与该项目链接的Alamofire库,一个是手动库,另一个是与CocoaPods一起使用。 这只是问题的一个例子,不用说我在其他62个库中也遇到了类似的问题。 我不想这样做。 我们决定摆脱内部Pod,而是创建框架。 我们不想放弃CocoaPods,因为我们的某些CocoaPods库与Carthage不兼容,说实话,用CocoaPods测试新库比使用Carthage容易得多。 我们的目的是同时拥有这两个功能-包括由Carthage与CocoaPods共同构建的第三方库,以及我们的内部框架和项目。 好主意…这就是真正的工作开始的地方。 在对如何将Pod与框架结合在一起进行研究之后,我创建了一个有效的概念证明,但我对此并不十分确定,也不知道它在大型项目中将如何工作。 关于框架 框架是什么? 我们可以将框架看作是独立的并可以链接到项目的捆绑包。 库和框架之间的主要区别在于控制反转(IoC)。 当您使用库中的内容时,就可以对其进行控制。 另一方面,当您使用框架中的某些内容时,您会将其责任转移给框架。 […]

在表视图中显示异构数据

移动应用程序的常见发展之一是使用表格显示信息 。 当您具有同类实体的集合时,可以轻松完成此任务,但是当此集合具有n个不同的实体时,它将变得更加棘手。 在本文中,我将展示一个示例,说明如何使用适配器模式在表视图中显示异构数据 。 公开的示例是具有两种消息类型的消息传递应用程序。 文字和图像。 当我们面临在表中显示异构数据集合的问题时,直接的解决方案是在“ cellForRowAtIndexPath”方法中使用模式匹配来确定我们需要使用哪个单元格来显示集合中的当前实体。 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let currentItem = itemsArray[indexPath.row] switch currentItem { case let item as TextMessage:< let cell = tableView.dequeueReusableCell(withIdentifier: “TextMessageCell”, for: indexPath) as! TextMessageCell< cell.configure(viewModel: item) return cell case let item as ImageMessage: let cell = tableView.dequeueReusableCell(withIdentifier: “ImageMessageCell”, for: […]

开发新的iOS应用

创建iOS应用程序非常简单,特别是在为Apple Watch开发应用程序时,对人们很有帮助。 首先,我和我的一位同学决定,我们将开发一个iOS App。 当我对亚当说这句话时,我们决定我们将制作一个iOS应用程序。 我没有任何苹果计算机(但现在还没有)。 我订购了带触摸条的MacBook Pro。 这个程序决定了人们的时间。 人们可以以完全不同的方式安排自己的时间。 您可以列出清单,这可能是您周末的想法或一个月内必须完成的项目。 您可以从Wikihow探索一些时间管理技巧。 创建一个应用程序将您的整个想法和创造力整合到一个真正对人们有用的软件中。 我已经开始处理外部代码文件。 该公司可能被命名为RalasiInc。您的应用和公司的标语是: 用技术个性化生活 我会在几个月内发布应用的完整说明。 有一个好的阅读! 祝你今天愉快!!