Tag: 编程

带有CALayer的动画进度加载器— Swift和Xcode

开发iOS应用程序时,通常需要从CDN中获取图像,这可能需要一些时间,具体取决于图像的大小,服务器速度和设备的网络连接。 在此获取时间内,您的UI将已经呈现,并且您想显示图像获取进度的可视指示器。 在iOS上,您具有默认的UIActivityIndicatorView 。 它可以工作,但是您可以轻松创建更具个性化的新对象。 要求 Xcode Swift的知识 Apple Swift官方文档(https://developer.apple.com/documentation/quartzcore) 斯威夫特游乐场 让我们深入研究代码 首先,我们需要创建装载机的形状。 对于此示例,我们需要一个循环加载器。 让我们创建跟踪图层,以显示加载程序的形状。 让trackLayer = CAShapeLayer() trackLayer.position = CGPoint(x:50,y:50) trackLayer.lineCap = CAShapeLayerLineCap.round trackLayer.lineWidth = 2 trackLayer.fillColor = UIColor.clear.cgColor trackLayer.strokeColor = UIColor(红色:80/255,绿色:80/255,蓝色:80/255,alpha:0.5).cgColor trackLayer.anchorPoint = CGPoint(x:0.5,y:0.5) 现在已经创建了图层,我们想要定义圆形。 trackLayer.path = UIBezierPath(arcCenter:.zero,半径:10,startAngle:0,endAngle:2 * CGFloat.pi,顺时针:true).cgPath 为了显示跟踪图层,我们必须将其添加到视图中。 view.layer.addSublayer(trackLayer) 如果您在操场上跑步,您会在左上角看到一个圆形。 做得好,我们已经准备好跟踪层。 现在,我们需要创建一个新图层,该图层将与跟踪图层重叠并根据加载进度进行填充。 让shapeLayer = CAShapeLayer() shapeLayer.position = CGPoint(x:50,y:50) shapeLayer.lineCap = […]

数据结构

堆栈和队列 堆 堆栈是后进先出数据结构。 想象一下一大堆砖头。 您已经承担了将这些砖块放在盒子中运输的任务。 那么,看看这个庞大的堆栈,我们是从堆栈的底部开始拉砖还是从顶部取砖? 常识将指示我们从顶部开始,而不是从10,000磅的Jenga游戏开始。 这很像堆栈在这里的工作方式。 放置在LIFO数据结构中的最后一个元素是从中检索的第一个元素。 尽管堆栈可能从表面上看起来像数组,但元素的顺序支撑了功能。 因此,在创建堆栈时,必须限制访问堆栈中元素的方式。 队列 队列是先进先出列表数据结构。 先进先出数据结构意味着元素只能在后面插入,并在前面出队。 队列在现实世界中最好用购买电影票的线来表示。 在售票热线中,第一个排队的人首先要购买门票,排队的每个人都按照加入队伍的顺序购买门票。 像使用Stacks一样,从队列中删除数据的顺序对于其能否正常运行至关重要,因此确保对队列数据的访问进行适当管理至关重要。 var queue = Queue () queue.isEmpty // true queue.push(值:“一个”) print(queue.count) // 1 queue.push(值:“两个”) print(queue.count) // 2 queue.push(值:“三”) print(queue.count) // 3 queue.push(值:“四个”) print(queue.count) // 4 queue.isEmpty // 否 print(queue.pop()) //一个 print(queue.pop()) //两个 print(queue.pop()) //三个 print(queue.pop()) //四个 堆栈和队列的实际使用 在需要保留列表顺序或添加或删除项的顺序很重要的情况下,堆栈和队列可用作临时数据结构。

模块化iOS应用程序时的常见问题

您可能想模块化您的iOS应用程序,但是在某些情况下,事情可能会变得复杂起来 。 在这篇文章中,我将介绍在对现有的大型iOS应用进行模块化时遇到的最常见的问题,以及为解决或避免这些问题而采取的措施。 本文将主要介绍封装 , 循环依赖项, 图像 (捆绑), pbxproj以及将现有应用程序部分提取到框架中。 “好吧,我要在哪里创建这个?” 当您的应用程序中有框架时,您可能会想到的第一个问题是“您将在哪里为下一个功能编写代码?”。 正如我在上一篇有关框架的文章中所说的那样,您应该对框架进行分类。 您可以拥有一个Core框架,一些特定于功能的框架以及其他一些技术框架。 如果您的新功能或要开发的功能没有输入任何现有框架,则可能需要创建一个新框架。 请谨慎选择,因为如果您想更改此新功能或与该新功能交互 ,它肯定会在以后产生影响 。 “公共的,内部的,私人的?” 您将在您的鼻子前看到这个弹出窗口! 这是因为您需要声明您的类/结构或您在模块中定义的任何内容,并希望以public的形式从外部 访问它。 在开发不带框架的应用程序时,您通常不会过多地关注可见性或访问控制,因为默认情况下,Swift中的所有内容都是internal 。 内部意味着您可以在当前模块中访问它。 在开发模块时,需要从外部将要使用的类显式定义为public 。 这也迫使您拥有更好的代码封装并更好地定义应用程序结构 。 您只应将希望从框架外部 访问的类型标记为公共 。 其他所有内容至少应该是内部的 ,或者甚至是私有的(如果用于本地)。 因此,如果您想消除Xcode错误,只需将您的类标记为public即可 。 “让我们在需要的任何地方导入此框架!” 对,但是 ! 使用框架时,您必须要小心,否则您将面临循环依赖和许多麻烦 。 在您的框架内,您不能导入已经 直接或间接 导入第一个框架的第二个框架。 另外,您可能会遇到这样的情况,即功能框架(假设为Account )想了解有关另一个框架( Booking )的一些知识,以创建链接。 例如,您想根据您在“ 帐户”部分中的 偏好启动预订搜索 。 您想从帐户框架中启动搜索,因此您可能要导入Booking框架,但这是错误的,因为这将质疑这两个框架的分离。 那么,如何处理不应相互导入的两个框架之间的链接 ? 这种情况是一个有趣的问题,一种解决方案是使用称为POP […]