Tag: 教程

使用BrightFutures,Alamofire和Operations排队上传多张图像

在开发我们的iOS应用程序“ Lines”时,我遇到的最大问题之一是创建可靠的图像上传队列。 该应用程序支持离线使用,因此,如果用户保存图像,则照片的本地标识符存储在CoreData中。 连接设备后,将立即获取并上传所有图像。 为了创建有效的上传队列,我必须使用以下框架: Alamofire用于http网络。 为了避免在获取多个图像时出现内存泄漏,我使用了OperationQueue来限制要处理的并发图像的数量。 而且BrightFutures将保证整个过程的顺利进行。

如何使用AppToolkit.io上的Screenshot Builder制作出色的截图

您希望全世界下载您的应用程序,因此需要确保您有一些精美的屏幕截图来讲述您的故事。 Apptoolkit.io是帮助您制作这些屏幕截图的一种工具。 (Apptoolkit是以前使用Launchkit.io的人们的替代工具。) 首先,了解您的价值主张。 您的应用程序做什么? 它为您的用户解决了什么问题? 哪些功能在您的潜在用户中创造了“啊哈”时刻? 考虑到这一点,请从您的应用中找到5个截图(可以在设备上或在模拟器上)回答这些问题。 分辨率越大越好,AppToolkit.io将生成iTunes,Google Play或任何其他用途可能需要的所有大小。 这是GoLocalApps提供的培根使一切变得更好的应用程序的初始屏幕截图。 一天中的每一餐都包含200种出色的培根食谱(包括健康食谱和饮料,谁知道呢?) 首先,创建一个帐户并登录。不需要信用卡,并且每个服务都有免费的层级。 接下来,选择您要为其截图的平台。 iOS将为您提供iPhone框架,Android将为您提供Android手机框架。 您可以从此处上传屏幕截图,可以从itunes帐户获取现有屏幕截图,也可以从图像网址添加屏幕截图。 然后选择您要使用的设备颜色。 您可以稍后更改。 某些设备是专业版功能的一部分(每月19美元)。 然后,您可以自定义屏幕截图。 在手机上方或下方添加文本,更改字体,背景颜色或图像,并使屏幕截图完全符合您的要求。 完成第一个操作后,您可以执行第二个操作,依此类推。 完成所有5张屏幕截图后,您就可以将所有不同大小的iTunes导出为zip文件并上传。 现在就可以了。Apple允许您使用一个集合,现在可以调整它们的大小,但是如果出于其他原因需要其他大小,现在就可以使用它们。 在这里,培根的最终屏幕截图使一切变得更好。 现在饿吗? Apptoolkit.io 是面向应用程序开发人员和营销人员的一组工具。 制作精美的屏幕截图集,应用登录页面并跟踪您的评论。 AppToolkit.io是GoLocalApps提供的一项服务 ,该 服务 自2010年以来一直在开发应用程序,并且多年来拥有一些畅销和下载的应用程序。

RainCat:第5课

下一个场景 那就对了! 我们正在转移到另一个场景。 实际上,完成后,这将是我们应用程序的第一个屏幕。 创建新场景,将其放置在Scenes文件夹下,并将其命名为MenuScene 。 在MenuScene.swift文件中输入以下代码: 按钮状态! 在SpriteKit中,按钮可能比较棘手。 有很多可用的第三方选项(我甚至自己做了一个),但是从理论上讲,您只需要知道三种触摸方法即可: touchesBegan(_ touches:with event 🙂 touchesMoved(_ touchs:with event 🙂 touchesEnded(_ touches:with event 🙂 我们在更新保护伞时简要介绍了这一点,但是现在我们需要知道:触摸了哪个按钮; 我们是释放水龙头还是单击该按钮; 如果我们仍在触摸它。 这就是我们的selectedButton变量起作用的地方。 当我们开始触摸时,我们可以捕获使用该变量开始单击的按钮。 如果将其拖动到按钮之外,则可以对其进行处理并为其提供适当的纹理。 释放触摸时,我们可以查看是否仍在触摸按钮内部。 如果是,那么我们可以处理与其相关的动作。 将以下代码行添加到MenuScene.swift的底部: 采取行动了! 现在,我们已经掌握了基本的按钮行为,我们需要一个事件来触发它们的点击。 易于实现的按钮是startButton 。 单击时,我们只需要展示GameScene即可 。 将MenuScene.swift函数中的handleStartButtonClick()更新为以下代码: func handleStartButtonClick(){ let transition = SKTransition.reveal(with:.down,duration:0.75) 让gameScene = GameScene(size:size) gameScene.scaleMode = scaleMode view?.presentScene(gameScene,过渡:过渡) } 如果您现在运行该应用程序并按按钮,游戏将开始! 现在我们需要实现静音切换。 我们已经有一个声音管理器,但是现在我们需要能够告诉它是否静音。 […]

RainCat:第2课

创造运动! 我们将更新雨伞以响应触摸。 在GameScene.swift中 ,查看空函数touchesBegan(_ touches :,带有event 🙂和touchesMoved(_ touches :,带有event 🙂 。 在这里,我们将告诉雨伞与游戏进行交互的位置。 如果我们基于当前触摸之一在这两个功能中都设置了伞形节点的位置,它将锁定到位并从屏幕的一侧转移到另一侧。 另一种方法可能是在UmbrellaSprite对象中设置目标,然后在调用update(dt :)时 ,我们可以朝该位置移动。 第三种方法可能是将SKActions设置为在touchesBegan(_ touches :,带有event 🙂或touchesMoved(_ touches :,带有event 🙂上移动UmbrellaSprite ,但是我不建议这样做。 这将导致我们频繁创建和销毁这些SKAction ,并且可能性能不高。 我们将选择选项#2。 更新UmbrellaSprite中的代码,使其看起来像下面的代码: 检测我们的碰撞! 现在,我们不需要担心很多冲突。 我们可能在雨滴,雨滴和雨伞以及雨滴和地板之间发生碰撞。 但是,我们确实需要检测雨滴何时击中了某些东西,因此我们可以告诉它被删除。 我们将需要创建一些变量来对每个SKPhysicsBody进行分类,以便我们找出它们碰撞时该怎么办。 为此,我们应该创建另一个名为Constants.swift的文件。 右键单击“支持”组下的,单击“ 新建文件” >“ Swift文件” ,然后单击“下一步”按钮。 将文件重命名为Constants ,然后单击Create 。 该文件应包含以下代码: 让RainDropCategory:UInt32 = 0x1 << 1 让FloorCategory:UInt32 = 0x1 << 2 让UmbrellaCategory:UInt32 = […]

iOS XCode简介

一直想构建一个应用程序吗? 不知道怎么办 我也不是,直到我参加了一些在线课程,发现它并不难(构建一个简单的应用程序)。 您也可以遵循本指南并熟悉XCode。 我目前是Flatiron School的沉浸式Web开发计划的学生,并且在周日通过Udemy在App Brewery学习Swift,所以我非常了解学习开发方法会令人生畏。 在这篇文章中,将没有任何编码。 我们将着重于让您设置并熟悉众多XCode面板。 在此处安装最新版本的XCode。 您至少需要第二至最新的macOS版本才能使用最新版本的XCode。 如有必要,请在此处更新Mac。 在macOS Mojave上运行的XCode 10演示了以下步骤。 根据界面的长短,界面可能会完全相同,也可能不同。 对于“组织名称”,您可以输入您的名字。 对于“组织标识符”,Apple要求使用反向域标识符。 那就是“ com”。 就像我们以前所看到的那样,在前面而不是结尾。 您想选择Swift是因为C ++正在逐步淘汰用于iOS开发。 我们不会针对此应用进行任何测试,因此请取消选中所有复选框。 以“ .swift”结尾的文件是您的代码文件。 以“ .storyboard”结尾的文件是您的设计文件。 “ Assets.xcassets”文件夹包含您的所有媒体文件。 您可以更改预览中显示的设备,这会直接影响您构建的应用程序的尺寸。 我将其从iPhone 8更改为iPhone XR,但是您可以选择任何设备,并且仍然可以正常使用。 让我们关闭视图面板,因为您想给自己尽可能多的工作空间。 选择最吸引您的字体。 如果看不到整个设备,请稍微缩小一点。 更新标签。 重新打开视图面板。 选择您的背景色。 我在Apple的预设颜色选择中使用了彩色铅笔选项,但是您可以通过所需的任何方法选择任何颜色。 花一分钟时间单击一下,然后使用颜色面板。 对于不同的设备,您将需要不同大小的同一图像,但是有一个很棒的网站appicon.co可以为您调整图像大小。 输入图像名称以找到图像。 在视图面板中,将图像拖动到标签上方,使其在标签之后分层。 在预览屏幕中,将图像拖到标签所在的位置。 现在我们在您的文本后面有一个黑板,让我们将文本颜色更改为白色。 有时,您的图片默认情况下会失真(在这种情况下不会),您可以通过“内容模式”属性更改图片的行为。 当您想要图像或标签的特定位置(由客户或设计团队提供)时,可以使用标尺面板输入所需的位置。 我知道您想要从0到100,但这就是这篇文章。 花一些时间来熟悉我们经历的所有面板。 有很多面板可供查看和记住,但是…… 恭喜您迈出了成为iOS开发人员的第一步!

React Native iOS应用中的多种方案和配置

React Native Schemes管理器 显然,由于packenger从节点模块目录创建Xcode项目引用时,packenger的工作方式,React-Native在处理Xcode构建配置和方案方面存在问题。 这可能是一个问题,因为您需要在应用程序中处理多个环境…… 幸运的是,您可以在React Native iOS应用中轻松处理多种方案和配置。 今天,我将撰写有关React Native Schemes Manager的工具,我发现该工具可用于解决React Native中的这一固有问题。 希望对您有所帮助。 1.添加新的构建配置 根据您的需要添加并命名新的构建配置。 您将通过克隆当前的“发行版”或“调试配置”来完成此操作。 在此示例中,我们将创建两个配置StagingQA的Debug副本和ProductionQA的Release副本: 2.为新的构建配置添加方案 如果您为每个构建配置创建模式,将更易于处理不同的包ID或显示名称或应用程序图标。 只要确保您创建的架构是“共享的”,并且在Run and Archive具有正确的构建配置参考即可。 有两种方法可以最快地创建一个新模式,即option(⌥) + click播放符号,然后复制原始模式。 您可以根据需要命名这些架构。 再次确保每个模式在Run和Archive中都具有正确的构建配置参考,并且已检查 “ Shared bod 。 3.安装React Native Schemes Manager 根据您的包管理器的偏好使用: yarn add –dev react-native-schemes-manager 要么 npm install –save-dev react-native-schemes-manager 4.更新您的package.json 按照React Native Schemes Manager的安装说明,您需要: 将 xcodeSchemes 部分 添加 […]

将UICollectionViews添加到自定义UITableViewCell Xib教程(Swift 4 Xcode 9.2)

我惊讶地发现在UITableViewCell中实现UICollectionView有多少绊脚石。 因此,我将把我使用的大量资源汇编成一个连贯的起点。 注意:这不是针对初学者的教程。 它假定您了解tableViews以及使用xib文件制作自定义单元格。 它也不会涉及使收藏夹视图看起来不错的任何事情。 在收藏夹视图中拖动 添加约束 找出您不能将CollectionViewCells添加到新添加的集合视图中。 原来,您需要一个单独的文件来容纳要显示的任何“收藏夹视图”单元格。 (当您的UICollectionView在Xib文件中时) 您可以在CollectionViewCell Xib中做任何您想做的事情,就本教程而言,我将更改背景色。 确保为您的单元格提供一个resuableIdentifier。 步骤1:返回您的tableViewCells Xib文件。 步骤2:显示文件大纲 步骤3:控制从您的collectionView拖动到“文件的所有者”,然后选择dataSource,然后再次进行选择代理。 步骤4:控制从collectionView拖动到TableViewCell类,然后创建IBOutlet 步骤5:将tableViewCell类与UICollectionViewDelegate和UICollectionViewDataSource一致 将UICollectionViewDelegate和UICollectionViewDataSource添加到类描述 在awakeFromXib中创建collectionView的数据源并委托= self 添加numberOfItemsInSection函数 添加cellForItemAt函数 创建一个带有您的reuseIdentifier的单元,并向下转换为您的自定义单元。 命中运行。 它将立即崩溃。 我们需要“为该标识符注册一个笔尖或类,或者在情节提要中连接原型单元”。 在您的tableViewCell从Nib唤醒的情况下,添加以下行: self.collectionView.register(UINib.init(nibName:“ CollectionViewCell”,包:nil),forCellWithReuseIdentifier:“ collectionViewID”) 生成并再次运行。 它将起作用。 这是更新的tableViewCell的代码: 故障排除步骤: 我的标识符是否已分配并正确? 我是否已从我的collectionView拖动到Xib文件中的文件所有者? 希望这会有所帮助。 如果您愿意,请给我鼓掌。 如果有问题请发表评论。 伊恩(Ian)-aestusLabs

iOS:如何使用可折叠部分构建表视图

第2部分。继续通过表视图采用协议和MVVM 这是我的“表视图”教程系列的第二部分,其中包含多种单元格类型。 在阅读了第一部分的多种回答和建议之后,我决定添加一些主要更新。 UITableViewController更改为UIViewController,并将TableView作为子视图。 现在,ViewModel符合TableViewDataSource协议。 NumberOfRowsInSection,cellForRowAt和numberOfSections是ViewModel的一部分。 这样可以将ViewController和ViewModel分开。 请在这里找到最终更新的项目。 感谢大家的贡献! 在第一部分中,我们创建了以下表格视图: 在本文中,我们将进行一些更改以使该部分可折叠:

查询CloudKit中的视频数组,下载并存储在Documents目录中-iOS的Swift 3教程

从CloudKit下载视频非常简单,但是我需要查看多个资源并弄清楚如何修复几个错误才能使所有这些工作正常进行。 本教程假定您具有CloudKit知识和使用documentDirectory的知识。 如果您不熟悉CloudKit,请查看此Ray Wenderlich教程。 这就是我用来学习基础知识的东西。 我们将在本教程中做什么 有一系列我们要下载的视频名称。 检查是否有任何下载 创建一个查询,该查询将发送未下载的视频数组 查询Cloudkit以查找我们需要的记录 下载视频并将其存储在文档中 我假设您已经知道如何设置CloudKit并上传了视频。 步骤1:设定 这是我将在本教程中使用的视频名称的数组。 您将需要更改项目以匹配您在CloudKit中存储的名称。 在您的ViewController中: 让arrayOfVideoNames = [“ Apple”,“ Banana”,“ Cantalope”] 步骤2:获取文档目录的内容 创建一个新文件。 该文件将包含一个名为DocumentsDirectoryFunctions的结构,该结构将具有与documentsDirectory相关的所有功能。 此结构的主要目的是获取documentDirectory的内容,以便我们可以将其与arrayOfVideoNames进行比较。 fileManager和getDocumentsDirectoryPath被标记​​为私有,因为我们不需要在结构外部使用它们。 如果需要,只需删除“私有”即可。 struct DocumentsDirectoryFunctions { 私人让fileManager = FileManager.default 私有函数getDocumentsDirectoryPath()->字符串{ 让directoryPaths = fileManager.urls(用于:.documentDirectory,在:.userDomainMask中) 让docsDirectory = directoryPaths [0] .path 返回docsDirectory } func getContentsOfDocumentsDirectory()-> [String] { var tempArray:[字串] = [] 做{ 让filelist […]

iOS:表格视图中的多个选择

第3部分。在iOS开发中继续采用MVVM 这是我的MVVM系列表视图中的第三个教程。 在前两部分中,我们使用不同类型的动态单元格创建了表视图,并添加了可折叠部分功能。 今天,我们将介绍另一个常用的“表视图”方案:多个选择。 在许多用例中,我们需要创建一个表视图,该表视图允许用户选择多个单元格。 通常,API提供您在表视图中显示的项目列表,用户可以选择一些项目以便以后使用(发送到后端,保存到本地存储,传递到下一个屏幕等) 。 有时,您希望将选择限制在一定数量之内,或者您不希望用户继续选择任何项。 这是我通常在现有应用程序中或在stackoverflow的一些答案中看到的内容: 让allItems = [Items]() var selectedItems = [Items]() 然后,当选择了单元格时,就可以通过这种方式在所选索引处添加或删除项目。 另一个解决方案稍微好一点:获取当前选定的TableView行的索引,然后将其映射到数据源项的数组: 如果让selectedIndexes = tableView.indexPathsForSelectedRows { //将索引映射到现有数据数组的棘手方法 //让selectedItems = … } 尽管第二种方法对于TableView来说更自然,因为它利用了内置方法indexPathsForSelectedRows,但如果要将ViewModel与View分开,仍然不是完美的选择。 将tableView索引映射到模型项是我们要避免的Massive View Controller模式的一个很好的例子。 如果要在重新加载tableView时保留选择,这将变得更加混乱:您需要保存当前选定的索引,重新加载tableView ,然后为每个选定的索引调用selectRow 。 但是两次重装之间dataSource发生了什么变化? 完成本教程后, TableViewController中将包含以下代码来处理多行选择: //什么代码? 那就对了。 完全没有代码。 一切将由ViewModel和TableViewDelegate处理 。 当您重新加载整个TableView或其任何部分时,选择将保持不变 。 听起来不错? 开始吧!