最近,我们发布了Early Game Alarm 2.0,它以7种语言提供并采用了全新的设计,因此我们决定就在(几乎)3年的开发中遇到的各种问题分享我们的经验。 我以前的帖子是关于页面布局的 ,我们曾用来向用户介绍可用的游戏和游戏包。 这将继续解决自定义布局的问题,我将使用一个简单的项目来说明我们如何在主屏幕上排列圆形警报。 在上面的图像中,您可以看到它在应用程序中的外观,在下面的图像中,我们将尝试在本教程中实现。 您可以从此链接下载完整的代码。 因此,任务很简单:我们正在收集特定半径的蓝色圆圈。 半径值显示在中间的标签上。 好的,它们不一定非要是蓝色-您可以选择任何想要的颜色。 让我们开始吧! 注意1:您可以 在 Byteout Software博客 上 找到具有 更好格式 的原始文章 。 注意2:本教程适用于已经具有自动布局和集合视图经验的开发人员。 我们不会详细介绍每个步骤。 对于初学者的教程,我建议从 Ray Wenderlich 教程开始。 步骤1:情节提要设置 创建新项目后,在情节提要中将获得一个视图控制器(类ViewController)。 对于本演示,我们将使用该演示。 让我们在Storyboard中添加以下内容:1个集合视图和1个标签在集合视图单元格中。 集合视图设置: 让我们将集合视图的顶部,底部,尾部和前部约束设置为0值。 不要忘记将ViewController连接为数据源并为集合视图委托。 单元格设置: 在超级视图(单元格)中水平和垂直居中放置标签 为背景和文本设置漂亮的字体和颜色 将单元格标识符设置为“ CircleCell” 创建自定义UICollectionViewCell(例如CircleCell)并连接插座。 例如,如果您不知道如何,可以查看此帖子。 步骤2:资料来源 现在,要实际显示单元格,我们需要实现UICollectionViewDataSource方法。 在ViewController.m中添加以下代码: // ViewController.m @interface ViewController () @property (strong, nonatomic) NSMutableArray *dataSource; […]
AR技术正在成为主流。 增强现实越来越多地用于平板电脑,智能手机等移动设备中,以改变现实世界与数字图像,图形相交和交互的方式。 增强现实被开发为移动应用程序,并被用于结合现实世界和数字组件。 因此,随着iOS 11引入了全新的增强现实应用程序框架,该框架创造性地称为AR工具包。 让我们深入研究顶级增强现实应用程序。 宜家广场: IKEA Place是第一个家具AR应用程序。 它可以帮助您将IKEA产品虚拟地“放置”在您的空间中。 应用链接:https://itunes.apple.com/us/app/ikea-place/id1279244498?mt=8 堆栈AR: Stack AR是一款AR游戏应用。 堆积尽可能高的积木! 应用链接:https://itunes.apple.com/us/app/stack-ar/id1269638287?mt=8 世界画笔: World Brush是有创造力的人的创意应用程序之一,您可以在现实世界中选择任何画笔进行绘画,每幅画都是匿名的,并保存在创建它的大概GPS位置。 应用链接:https://itunes.apple.com/us/app/world-brush/id1277410449?mt=8 天空指南AR: Sky Guide AR应用程序从未像现在这样令人愉悦且易于使用。 只需将其举在天空上自然发现天体,卫星。 无论年龄和经验水平,它都是一个美好的时光! 应用程式连结:https://itunes.apple.com/us/app/sky-guide-ar/id576588894?mt=8&ign-mpt=uo%3D4 全息: Holo是最好的免费AR应用程序之一,它可以让您创建进入现实世界的动物和超级英雄的全息图。 应用链接:https://itunes.apple.com/us/app/holo/id1194175772?mt=8 2018年人体解剖学图集: 人体解剖学是面向学生,专业人士和教授的3D应用程序。 该应用程序包括完整的女性和男性3D解剖模型,这些图像与3D横截面以及骨骼和肌肉的交互动画配对 应用链接:https://itunes.apple.com/us/app/human-anatomy-atlas-2018/id1117998129?mt=8 WallaMe —增强现实: WallaMe是与您的朋友共享增强现实消息,使用相机捕获图像并创建增强现实绘图的最佳增强现实应用程序选择。 应用程式连结:https://itunes.apple.com/us/app/wallame-hide-messages-in-real/id963058537?mt=8
您是否打算启动可能改变未来的新启动想法,并且正在开发应用程序? 或者您打算启动您的业务应用程序? 好吧,那么在实际选择澳大利亚的任何移动应用程序开发公司之前,您应该牢记以下十件事。 1.功能列表 这是一个非常重要的考虑因素,因为项目的成本将取决于您选择的功能。 移动开发公司将根据工时向您收费,而工时又取决于您要包含在应用内的功能。 您需要在功能上更加精确,不要做任何假设,记录每一个小事情(这似乎很明显),从长远来看肯定会很方便。 2.确定工作范围 工作范围明确说明了开发公司将要完成的工作。 这听起来类似于“功能列表”,但相信我,不是,工作范围将定义诸如iOS,Android,Windows之类的平台及其将支持的兼容操作系统的详细信息。 此外,非常清楚地定义超出范围的功能,因此您可以在同一页面上。 很少有诸如服务器成本,SSL成本,域名成本之类的事情被视为超出范围的功能。 3.项目开发方法 如果这太技术性,请不要强调,我会尽量保持外行语言。 因此,每个应用程序都将经历也称为SDLC的软件开发生命周期。 它们分为以下几类: 瀑布模型(一切都会首先开发,测试并交付。因此您将在一段时间结束时获得最终产品) 敏捷开发(在每个Sprint的末尾都有小型产品,您可以根据需要查看和设置优先级。) 如果您不确定功能列表中的内容,或者您想快速启动产品并快速添加新功能,我强烈建议您使用敏捷开发方法。 4.设计与线框 许多公司不遵循线框图,我强烈建议开发线框图,这是您最需要参与的阶段。 这是您需要反复往返的阶段,但在此阶段中,您将能够可视化您的产品,并且会弹出更多的想法。 线框后跟设计,您需要弄清楚产品的配色方案,这是UI(用户界面)和UX(用户体验)出现的地方。 如果您期望从发布的第一周开始会有大量用户,我建议您将经验丰富的UX设计师加入该项目,因为这是用户根据他们在该应用程序上的经验会留下令人敬畏的反馈和最差的反馈的部分。 使事情尽可能简单。 5.测试 这是大多数人挣扎和最生气的部分。 一定要请开发公司准备测试用例并首先进行自我测试。 另外,如果您的时间可用性至关重要,我建议您提高质量检查人员的质量,以确保您的应用符合标准要求。 否则,您最终会收到错误的反馈,最终会因为缺乏测试而使用户崩溃,使应用程序崩溃并导致糟糕的用户体验。 6.可扩展性 这又是最关键的部分,想像一下您的应用程序在市场上的销售情况良好,并排在App Store和Play商店的排行榜上(声音确实很棒),比起您想获得用户反馈或想要添加更多功能的情况到应用程序,您意识到现有应用程序不可扩展,需要进行重新开发才能满足要求。那么,即使您进行了重新开发,您是否认为在重新开发应用程序时不会吸引任何竞争对手? 想象一下Orkut和Facebook场景。 您显然不想以Orkut结尾,没有人愿意。 因此,请确保将可伸缩性功能传达给您的应用开发公司。 获得1小时的免费应用开发咨询 7.服务器管理 如果您想知道服务器到底是什么? 我需要购买机器吗? 一点都不。 服务器是存储您的应用程序数据的地方。 那么服务器管理是什么? 好吧,您将需要99.99%的正常运行时间服务器,以确保您的应用大部分时间都可用。 随着用户数量的增加,您可能需要升级服务器以管理流量。 因此,这些事情属于服务器管理。 8.支持 您应该至少从应用程序开发公司那里获得3个月的免费支持,因为您将需要一些售后支持,因为在收到反馈时会有一些看不见的错误和问题需要您解决。 。 9.安全性 安全是任何应用程序的核心。 如果您了解当前的加密货币世界,那么就会有很多黑客入侵,造成大量金钱的损失。 了解应用安全性的敏感性和重要性。 很少需要注意的是SSL,2要素身份验证,加密和解密。 另外,我建议将AWS用作后端服务器。 […]
iOS应用程序生命周期是一个非常大而复杂的主题。 我将尽力解释它。 下图来自斯坦福大学的iOS编程课程,从我看来,它清楚地表示了应用程序的生命周期。 让我们深入研究它,并尝试了解正在发生的事情以及原因。 实际上,当用户启动一个应用程序,浏览它,将其发送到后台,启动另一个应用程序,从内存中卸载它,应用程序将“消息”发送到应用程序委托类时,您可以从那里捕获并处理它们。 应用程序在不同的生命周期状态中移动,这些状态由其活动级别定义,例如未运行,不活动,活动,后台,已暂停。 关于应用状态的几句话: 未运行-应用尚未启动或系统已将其关闭。 无效-启动之前的应用程序状态。 应用程序正在运行,但正在执行其他操作,尚无法与用户交互一起使用。 活动-在前台运行并与用户合作的应用的正常状态。 应用程序接收事件,更新UI。 背景-背景状态,表明应用程序仍在运行,但用户看不到它的界面。 已暂停-应用程序仍在设备内存中,但是代码未运行。 如果发生内存不足的情况,系统可能会在不通知的情况下终止应用程序。 关于应用程序委托和在不同生命周期状态下调用的方法的几句话: 首先让我指出,应用程序委托是UIApplication对象调用的一组方法,用于响应应用程序生命周期中的重要事件。 它将确保应用程序与系统以及其他应用程序进行预期的交互。cI将指出最重要的应用程序委托方法。 应用程序成功启动启动过程后: 应用程序:willFinishLaunchingWihtOptions 叫做。 这是执行任何代码的第一个机会。 如果启动成功: 应用程序:didFinishLaunchingWithOptions 方法被调用。 同时,应用程序发布通知UIApplicationDidFinishLaunchingNotification。 当应用程序完成启动并准备好显示任何窗口时,将调用此方法,因此这是准备界面的最后机会。 在上图中,这些进程的状态标记为数字1。 申请生效后: applicationDidBecomeActive 叫做。 当您的应用程序从非活动状态转换为活动状态时,将调用此方法。 [箭头2。] 如果用户按下了主页按钮或启动了另一个应用程序: applicationWillResignActive 调用,并发布UIApplicationWillResignActiveNotification。 当应用程序过渡到非活动状态时,将调用此方法。 对于某些类型的临时中断(例如打来的电话或SMS消息),或者当用户退出应用程序并开始过渡到背景状态时,可能会发生这种情况。 您可以在图中的数字3下看到此过程。 进入非活动状态后 applicationDidEnterBackground 被调用,并开始向后台过渡。 在图中,此过程在箭头4下方列出。也许还不清楚,但是我所指的箭头方向是从非活动状态到背景状态。 如果应用程序没有被用户终止或被系统杀死,则可以返回到前台,它是箭头5,与箭头4相反。调用的方法是: applicationWIllEnterForeground 但是该应用未移至活动状态,但仍保持不活动状态。 我要向您介绍的最后一个委托方法: applicationWillTerminate。 当终止事件被触发时,它通知委托。 强制退出应用程序或关闭设备会触发该方法。 这意味着该应用程序将从内存中完全删除。 箭号8。 可能您想知道暂停状态。 我没有透露太多信息,因为应用程序在进入后台模式后正处于这种状态。 这是当应用程序在后台但未运行实际代码时的状态。 […]
当用户选择快速操作时,您的应用程序将启动(如果当前未运行),否则,如果您的应用程序已启动并且处于后台/暂停状态,则您的应用程序将在应用程序委托对象收到快速操作之前被激活消息或通知。 对于任何应用程序,我们最多可以有4个快捷方式操作;如果从应用程序商店下载了第五个名为shareApp的快捷方式,则系统会添加该操作。 我们的应用程序中可以同时包含静态和动态快速操作,但是静态操作比动态操作具有更高的优先级。 因此,如果您的应用具有3个静态操作和3个动态快速操作快捷键,则只会向用户展示一个动态操作以及这3个静态操作。 →开始编码: 要添加快速操作,请在应用程序的Info.plist文件中创建UIApplicationShortcutItems的数组。 该数组的每个元素都是一个字典,其中包含一个快速动作的属性( 例如动作的标题,字幕,图标,动作的类型(快捷方式的唯一标识符) ) 。 按键说明: UIApplicationShortcutItemType:必需的字符串,用于标识您的快速操作。 字符串必须是唯一的且特定于应用程序。 一个好主意是在它的前面加上您的包ID或其他一些应用程序唯一的String。 如果您想使用应用程序包标识符,请使用类似这样的占位符,该占位符为您提供包标识符的路径。 “ $(PRODUCT_BUNDLE_IDENTIFIER)”。 因此,即使将来更改了捆绑包ID,您的应用程序快捷方式也不会生效,也不需要在其他类似位置手动更改捆绑包ID。 UIApplicationShortcutItemTitle:必需的字符串,一旦用户按下应用程序的图标,该字符串就会显示快速操作的标题。 如果您的应用程序已本地化,则可以设置Localized.string文件的String键。 向用户显示了快速操作。 UIApplicationShortcutItemSubtitle:一个可选的字符串,用于显示快速操作的字幕。 字幕也可以本地化为标题。 UIApplicationShortcutItemIconType:可选的字符串,显示由库提供的系统图标。 检查UIApplicationShortcutIcon枚举以查看所有可能的字符串键。 UIApplicationShortcutItemIconFile:可选的字符串,用于显示要从应用程序包中使用的自定义图标图像,或资产目录中图像的名称。 UIApplicationShortcutItemUserInfo:一个词典,其中包含一些您想通过快速操作传递的额外信息。 快速操作会在iOS主屏幕上显示给用户,因此在选择这些选项时,我们需要在我们的应用中进行处理。 处理它们的最佳位置是您的App-elegate类。 在此应用程序中,我为UIApplicationShortcutItemType使用了一个枚举,以避免键入错误。 每当用户在主屏幕上选择快速操作时,在应用程序的App-delegate类中,都会调用application:shortcutItem:completionHandler:方法。 此方法必须使用布尔值调用完成处理程序,这取决于快速操作的成功或失败。 在application:didFinishLaunchingWithOptions:方法中,我们将该值保存到launchShortcutItem中,以便接下来可以处理它。 下一个要调用的方法是applicationDidBecomeActive ,此方法在application:didFinishLaunchingWithOptions:之后启动:在您的应用程序首次启动期间,或者每次用户进入您的应用程序时,该应用程序仍在后台打开。 当用户选择一项快速操作时,该应用将启动或继续。 因此,将在调用performActionForShortcutItem方法之前,调用上述两个方法( application:didFinishLaunchingWithOptions:或applicationDidBecomeActive )中的任何一个。 正如我们上面所讨论的,这是通过使用true或false调用完成操作(Bool)来处理快捷方式操作的必需方法。 在下图中,我为快速操作的快捷方式标识符定义了一个枚举。 我使用此枚举类型来查找用户在handleShortcutItem方法中触发了哪些操作。 在下图中,我们定义了handelShortcutItem方法。 首先,我们检查触发的快捷方式操作的类型是否为nil。 然后得到触发类型。 使用开关盒后,将执行所需的功能。 →动态快捷方式动作:到目前为止,我们已经看到了在应用程序的info.plist文件和然后在AppDelegate类中配置的静态动作。 我们也可以实现动态动作,但是请记住仅显示了4个动作,静态动作的优先级较高。 让我们看看配置动态动作。 在上图中,我通过代码配置了动态操作。 首先,我设置了类型,记住它必须是唯一的并且是必需的,就像在我以应用程序的包标识符作为前缀分配类型之前一样。 然后,我通过API初始化了快捷方式项。 在这一章中,您可以根据需要动态地提供标题和副标题(以及图标)。 最后,我将创建的项目分配给UIApplication的shortcutItems数组。 您可以在需要的地方调用上面的代码段,该代码段已包装在函数中。 […]
设计模式是针对软件设计中常见问题的可重用解决方案。 它们是旨在帮助您编写易于理解和重用的代码的模板。 最常见的可可设计模式: 创作性 :单身人士。 结构 :装饰器,适配器,外墙。 行为的 :观察者,和,纪念品 让我们开始吧…… 🏄🏻 正面 Facade设计模式提供了到复杂子系统的单个接口。 无需向用户提供一组类及其API,而是仅公开一个简单的统一API。 当使用大量类时,尤其是当它们使用复杂或难以理解时,此模式是理想的选择。当外观下的类可能会更改时,这也很有用,因为外观类可以保留相同的API事情在幕后发生变化。例如,如果您想替换后端服务的日子到了,您将不必更改使用API的代码,而只需更改Facade中的代码即可。 装饰器 装饰器模式可以动态地 向对象添加行为和职责,而无需修改其代码。 它是子类化的替代方法,在子类化中,您可以通过将类与另一个对象包装在一起来修改类的行为。 在Objective-C中,此模式有两种非常常见的实现: 类别和授权 。 在Swift中,此模式还有两种非常常见的实现: 扩展和委托 。 委托:用于将实现特定的行为排除在通用类之外。 iOS中的许多UI元素都使用委托来控制其行为,例如UIScrollView。 UIScrollView类不知道应该滚动什么,因为那是应用程序特定的任务。 因此,要通知应用程序滚动事件,它将使用UIScrollViewDelegate。 应用程序可以实现委托,然后拦截由UIScrollView发送给它的滚动事件。 纪念品 在Memento模式中, 可以将您的内容保存在某处 。 稍后,可以在不违反封装的情况下恢复此外部状态。 也就是说,私有数据保持私有。 Memento模式的实现示例是存档,序列化和 状态恢复 。 适配器 适配器设计模式将类的接口转换为客户期望的另一个接口 。 Adapter使类可以协同工作,否则由于接口不兼容而无法实现。 它将客户端与目标对象的类分离。 苹果使用协议来完成这项工作。 您可能熟悉UITableViewDelegate , UIScrollViewDelegate , NSCoding和NSCopying等NSCopying 。 例如,使用NSCopying协议,任何类都可以提供标准的copy方法。 观察者 观察者设计模式定义了对象之间的一对多依赖关系,因此当一个对象改变状态时,其所有依赖关系都会被通知并自动更新。 观察者模式本质上是一个发布和订阅模型,其中主题及其观察者是松散耦合的。 […]
SequenceType和CollectionType具有一个很酷的名为lazy属性。 Apple将lazy定义为:“一个包含与该序列相同的元素的序列,但是在其上懒惰地实现了某些操作,例如map和filter 。” 最好用一个例子来说明。 假设我们有以下代码: //创建一个包含1到1,000的数字的数组。 变数= [Int]() 数字+ = 1…1_000 让newNumbers =数字 .filter {$ 0%2!= 0} //已执行1,000次 .map {$ 0 * 10} //执行500次 打印(“ \(newNumbers.last)”) 如果要访问newNumbers的最后一个元素或任何元素,则必须执行构建newNumbers数组所需的每一个计算。 那是`filter`的1000次迭代,而map另外500次。 现在,更懒惰的: //创建一个包含1到1,000的数字的数组。 变数= [Int]() 数字+ = 1…1_000 让newNumbers = numbers.lazy .filter {$ 0%2!= 0} //仅执行3次 .map {$ 0 * 10} //仅执行1次 打印(“ \(newNumbers.last)”) 这次,我们只完成了filter三个迭代,以及map一个迭代。 因为我们使用了lazy序列属性,所以实际上返回了一个新类型( LazyMapBidirectionalCollection ),而不是简单的数组。 […]
我发现很多人通过搜索引擎访问了我在Swift中有关设计模式的文章。 因此,我在本文中收集了它们,以使读者可以轻松找到它们。 谢谢。 创作模式 Swift World:设计模式-简单工厂 如果我们想学习一种编程语言,我们需要忍受它。 这意味着尽可能多地使用Swift。 今天… medium.com Swift World:设计模式-工厂方法 您还记得我们在上一篇文章中讨论的简单工厂模式吗? medium.com Swift World:设计模式-Singleton 辛格尔顿在可可中非常受欢迎。 我们可以找到不同的用例。 以下是两个示例。 medium.com Swift World:设计模式-生成器 通常,在制造汽车时,我们首先制造每个零件,然后组装它们。 作为客户,我们不需要… medium.com Swift World:设计模式-抽象工厂 今天我们将讨论抽象工厂模式。 它处理更复杂的用例。 众所周知,轿车… medium.com 结构模式 Swift World:设计模式-适配器 我们已经完成了创建模式,并将在本文中介绍结构模式。 从字面上看,结构性… medium.com Swift World:设计模式-桥梁 您还记得我们的汽车系统结构吗? 我们有一个协议和不同的实现方式,例如下面的代码。 medium.com Swift World:设计模式-装饰器 装饰器是一种结构化模式,可在运行时向类或实例添加新功能。 与继承相比,它具有… medium.com Swift World:设计模式-外立面 从字面上看,facade表示 medium.com Swift World:设计模式-代理 今天,我们将讨论代理模式。 在这种模式下,代理是一个对象,可以帮助我们访问另一个对象。 […]
当我们谈论有关iOS应用程序的安全性时,我们通常会考虑诸如SSL证书,将信息安全地存储在钥匙串中之类的事情。 这一切都很好,而且我们现在如此广泛地关注是一件非常了不起的事情。 但是,有一个小的罪魁祸首是许多应用程序制造商似乎忽略了,我不怪他们。 我说的是操作系统内置的多任务处理功能。 那么,是什么使它成为罪魁祸首? 好吧,基本上,如果用户决定退出您的应用程序,则操作系统将为当前视图控制器的当前状态制作快照,并将其保存为应用程序的占位符。 但是,如果您刚离开的屏幕上有一些您不想离开应用程序的个人信息,该怎么办。 也许您正在使用银行应用程序,而同事或朋友借用您的电话,则他或他将能够阅读您上次使用该应用程序查看的部分信息。 听起来好像我过度夸大或出于非问题而提出了问题。 也许吧,也许不是。 我所知道的是,如果我使用存储个人或敏感信息的应用程序,则希望它保留在该应用程序内,而不会以任何方式,形状或形式泄漏。 因此,这就是我们为应用程序增加一些额外安全性所做的工作。 因为我们不确切知道哪个屏幕应该安全或哪个屏幕可以显示,所以我们采取了尝试保护整个应用程序的路径。 这就是我们所做的。 在构建iOS应用程序时,您需要提供一个应用程序委托。 此类具有在我们的应用程序的上下文更改时被调用的方法。 我们将使用应用程序委托监听的两种情况是: func applicationDidBecomeActive( _ application:UIApplication) func applicationWillResignActive( _ application:UIApplication) 您可能已经知道很多,即使您不知道。 您可能会猜测何时调用这些方法。 当我们的应用程序变为活动状态时,第一个被调用,而当用户离开我们的应用程序时,第二个将被调用。 因此,为了增加一点安全性,我们将使用模糊的视图简单地覆盖当前窗口,以免撬开的眼睛看不到屏幕上正在显示的内容。 使用模糊功能不是最安全的选择,但是暂时,我们只希望在有人借用电话时将可以直接访问电话的人拒之门外。 如果需要更高的安全性,则可以显示应用程序启动屏幕或猫的图片。 由你决定。 聊够了,让我们看一下代码。 请记住,仅添加一点点的安全性是不够的,您可能想要添加一个密码屏幕并执行通常执行的所有其他与安全性相关的任务。 这只是为了防止您的应用向iOS上的多任务功能泄漏信息。
在本教程中,学习如何为iOS 10创建分段控件 。 分段控件允许用户在每次按下按钮时更改其应用程序中的内容。 在本教程中,我们将创建一个基本的分段控件,以在每次按下按钮时更改标签的文本。 让我们开始吧 首先,打开Xcode并单击Create a new Xcode project 。 然后,在iOS标签下选择“ 单一视图应用程序 ”。 单击下一步 。 然后,在“ 产品名称”字段中,输入SegmentedControl 。 在“ 组织名称”和“ 组织标识符”字段中,键入所需的任何名称。 确保在“ 语言 ”下选择“ Swift” ,在“ 设备”中选择“ iPhone” 。 保留Use CoreData并取消选中两个测试。 然后,单击“ 下一步”并将其保存到所需的位置。 保存文件后,在Project Navigator上转到Main.storyboard文件。 然后在对象库中搜索分段控件 ,并将其拖动到视图控制器的顶部。 接下来,在对象库中,拖动标签并将其放置在新的分段控件的正下方。 选择您的标签,然后单击右上角名为“ 显示属性检查器”的第四个图标。 命名您的Label One ,这将是分段控件第一个按钮的起始值。 您可以将字体增加到24,以便更好地显示标签 。 在“ 对齐”区域中单击“ 居中 ”。 添加约束 选择您的分段控件,然后在右下方的“ 自动布局约束”图标所在的位置,单击“ 添加新约束” […]