Tag: 开发

该死,我们刚发售了一款游戏!

Marc Vandehey向您展示了如何在Swift 3中构建SpriteKit游戏 您是否曾经想制作一款游戏,却被开发和设计的复杂性所吓倒? 别害怕我的朋友,十三二十三有你的背! 这个由高级开发人员Marc Vandehey撰写的系列文章分为5部分,展示了为iOS平台制作SpriteKit游戏是多么简单。 小猫,小猫 游戏称为RainCat。 有一个简单的前提:我们要喂一只被雨淋困在外面的饥饿的猫。 具有讽刺意味的是,我们的RainCat不喜欢雨,潮湿时会变得悲伤。 为了避免猫科动物的悲伤,我们必须做个保护伞,尽力(作为保护伞)保持在RainCat上方,让她吃饭,并最终开心。 听起来很简单,对吧? 开发游戏也很容易! 下面列出了所有5个课程。 您只需开始: Mac电脑 Xcode 8 耐心,蚱hopper RainCat:第1课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第2课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第3课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第4课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第5课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 在 Facebook 和 Twitter上 找到我们, 或者在 thirteen23.com 上 与 我们 联系 。

iOS。 具有Swift泛型的通用单元

首先,我们必须承认在设计上不可能使用UITableViewCell而不是UICollectionViewCell,反之亦然。 因此,最好创建一些可以代替这两个类使用的东西。 UIView是一个很好的起点,因为它是UIKit中最通用的UI组件。 屏幕上显示的所有内容都可以使用它来创建。 我们可以将其放在表或集合单元中,作为其他所有内容的容器。 让我们从这个简单的想法开始。 第一次尝试 您可以看到其中具有任何视图的集合单元。 在这里以及我们进一步假设,很容易为表单元格创建相同的版本,并且省略了这种实现而不重复代码并减少读取时间的实现。 尽管单元格变得更加通用,但是这种方法给我们带来了一些缺点: 我们失去了标准单元的重用,需要自己创建视图池。 这意味着使用UIKit库进行代码复制; 使用xib更加困难,因为我们需要将所有内容都嵌入到视图中。 有一个恒定的视图类型,因此我们每次使用视图时都需要强制转换类型。 视图的框架严格限制为与单元格内容相同。 我们将使用Swift Generics对其进行进一步修复。 第二次尝试 作为第二种方法,我们对之前的代码进行了一些更改: 首先,如果我们要使用系统的重用,则单元格内部的视图不应更改。 这意味着我们将该属性标记为常量,并在单元初始化期间创建一个视图。 其次,让我们使用Swift Generics到处都知道视图类型。 现在看起来好多了。 但是我们仍然需要讨论有关从xib加载的大问题。 您通常需要一个xib名称,有时还需要一个束名称(对于框架而言)才能从xib加载某些内容。 如果xib与视图的类存储在同一束中,则xib名称足以加载视图,因为可以使用Bundle(for:Class)方法从该类接收束名称。 这是需要提供名称的协议LoadableFromXib ; 以及从xib文件加载视图的load方法的实现。 现在,在单元初始化期间从xib加载任何视图要容易得多。 看一下LoadableFromXibContentCollectionCell类中的视图初始化: 因此,现在我们可以使用任何视图创建集合(和表)单元,或者使用初始化程序创建它或从xib加载它。 系统对这些单元的重用( 任何视图)都是免费的。 最后,为了使解决方案更通用,让我们在视图中添加插图,因为单元已负责视图的定位和大小调整。 注意,在单元重用期间必须将内容插图恢复为零。 当然,可以向通用单元格添加更多属性,但是看起来contentInsets属性就足够了,因为通用单元格只负责在其内部定位视图。 总而言之,我们创建了具有以下功能的通用单元: 任何视图都可以轻松地转换为表单元格或集合单元,无论它是从xib加载还是以编程方式创建。 例如: SimpleContentCollectionCell -是包含标签的集合单元。 视图填充或边距不会发生变化,因为可以使用像这样的单元格的contentInsets参数来固定它们: cell.contentInsets.left = 20-从左侧增加20个点的插图。 在单元格上设置一些值时,我们确实知道该单元格的视图类型: cell.view.text =“单元格文本” 我已经发布了这篇文章,以分享一些Swift代码中的有用方法。 希望这会有所帮助。 此外,我们非常欢迎您评论和讨论该方法,并在您的项目中使用它。 另外,请随时下载游乐场以显示桌子高亮状态等:Universal Cells游乐场。 […]

如何在macOS中制作标签

开发应用程序时常见的UI元素是标签。 在iOS和tvOS中,此元素称为UILabel 。 可能令您感到奇怪的一件事是macOS没有这样的对手。 相反,我们需要使用文本字段,更具体地说是NSTextField 。 为了保持传统,我们将两个平台的标签实现简单地比较两个世界。 这里没有什么特别的,我们创建标签,给它一个框架,分配一些虚拟文本,将白色设置为背景色,然后告诉标签调整大小以适合内容。 在生产应用中,通常不调用sizeToFit,除非在手动计算元素大小时需要标签的确切帧大小。 我通常会坚持大多数UI实现的约束。 关于iOS / tvOS的知识已经足够多了,让我们开始讨论一下如何在macOS上完成此工作。 我们首先创建一个NSTextField并设置一个框架。 接下来的事情是将文本添加到我们的标签中, NSTextField不提供类似于UILabel的文本属性。 相反,我们需要将stringValue设置为文本字段; 这与NSTextField的继承有关。 它继承自NSControl , NSControl具有与值相关的一堆属性,例如doubleValue , floatValue , intValue等。在处理从NSControl继承的其他类时,要牢记这一点。 如果要从NSTextField中提取文本值,则可以使用相同的属性来实现。 接下来是设置背景色,如果您还记得有关将背景色应用于NSView的文章 ,您会注意到这与该实现有所不同。 NSTextField具有采用NSColor的backgroundColor属性。 分层方法不适用于NSTextField 。 告诉标签为sizeToFit足以使标签显示在屏幕上,但这不会给我们想要的输出。 您会注意到我们在文本字段周围有一个边框,要摆脱它,我们只需将isBezeled属性设置为false和voila 。 现在看起来像是预期的,但是我们需要做的最后一件事是使它充当标签而不是文本字段,并且将isEditable设置为false。 就是这样,我们已经在macOS上创建了与UILabel等效的东西。

Todays Extension ve ortak钥匙扣kullanımı

iOS版本,扩展名为’larda Keychain’desakladığınızverilereerişmenizgerekebilir。 密码登录Token’ınkeychain’e kaydettiniz veuygulamanızaeklediğinibirwidget’ında bu Token’aerişmesigerekiyor。 Uygulamanızveextesion’larınıarasında钥匙扣paylaşımıoldukçakolay。 1-开发人员hesabınızdanuygulama Prefix’inialın: developer.apple.com->证书,标识符和配置文件->应用程序ID->Uygulamanızaltındali“前缀”我不是。 2-钥匙串共享 ProjeayarlanızındaKeychain Sharing’i aktive edin。 Ve 1.adımdakiprefix’iaşağıdakigibi ekleyin。 3-.dosyasınıkontrol edin的权利: 项目Navigator’da XCode’unoluşturduğu.entitlementsdosyalarınıaçın(1个aduuygulamanıziçin1个adet deoluşturduğunu扩展名için)。 扩展名.dosyasında的“钥匙串访问组”项0到项1扩展名2。添加“钥匙串组”的名称2的名称。 Veişlemtamam,扩展名veuygulamanızkeychain’ipaylaşıyor。

使用Carthage在iOS上建立依赖关系

在本文中,我想分享我使用Carthage构建依赖项的经验。 首先,迦太基闪耀着简单。 通过在Cartfile添加适当的行并运行carthage update ,开始在Xcode项目中使用某些外部依赖关系非常简单。 但是众所周知,生活是残酷的,有时我们需要考虑更复杂的例子。 假设有一个iOS开发人员团队。 Tony,John和Keith正在使用约15种流行依赖项(例如Alamofire,Kingfisher,ReactiveCocoa等)运行iOS应用程序。 不同的编译器 -有些库是用Swift编写的,这意味着每个不同的编译器运行时都与其他运行时不兼容。 如果那些开发人员使用不同版本的Xcode,这可能是一个巨大的问题。 他们每个人都需要构建自己的框架版本或使用相同版本的Xcode。 清理构建时间 -这是最近的热门话题,有时我们需要关心构建时间,尤其是在CI上以及在分支之间切换时。 团队认为他们不想花很多时间(例如1个小时)等待发布,所以这个问题可能很关键。 存储库大小 -一些开发人员更喜欢在存储库中包含已编译的框架。 团队正在使用免费的github计划,因此其最大存储库大小为1GB。 在回购中存储框架可能会导致其大小大幅增加,甚至达到5GB左右。 即使回购存储限制不成问题,克隆这样的存储库也将花费大量时间 。 这对于干净的构建时间可能会产生巨大的影响,尤其是在将CI与虚拟机一起使用时。 更新框架 -在不进行额外工作的情况下,迦太基会在运行carthage update时重新编译所有框架,或者如果为单个依赖项而运行则仅会编译一个框架。 在项目开始时,我们经常这样做。 团队也在寻找解决方案以加快这一步。 没有免费的午餐……我同意,但是与此同时,我相信有时值得花一些时间来改善日常工具。 我花了很多时间来测试依赖项管理器,缓存其工件等。让我告诉您有关维护迦太基框架的三种流行解决方案。 在你开始之前 如果您不熟悉迦太基,请先查看它的存储库。 我不会考虑将迦太基框架直接存储在存储库中。 让故事开始……托尼是团队负责人,他决定使用迦太基作为依赖性管理器。 他在使用外部框架时为其他开发人员定义了一些规则: 将Carthage / Build添加到.gitignore并在存储库中包括Carthage/Checkouts , 首次克隆存储库时,您需要运行carthage bootstrap (重建所有依赖项)。 CI需要为每个管道运行该程序, 更新框架时,请仅更新一个框架,例如carthage update ReactiveSwift 。 这些规则很简单,但是它们的优缺点又如何呢? 优点: 免费(每月费用0$ ) 仓库的规模永远不会急剧增加 缺点: 非常长的整洁版本 绝对不会重复使用预编译的框架 存储库中的其他人的代码 […]

带有Fastlane的简单iOS版本

在准备发布iOS应用程序时,您将面临许多繁琐的重复性过程,例如处理证书,配置文件,上传翻译,使用应用程序支持的所有语言进行屏幕截图等。 下面我将向您介绍名为Fastlane的工具,该工具将为您处理大部分任务。 工具概述 为了构建,签名和发布应用程序,我们将使用以下工具: 在Apple Developer Portal和iTunes Connect中创建新应用的产品 匹配以创建证书和配置文件 用于构建和归档iOS应用的健身房 快照和框架,用于在所有支持的语言上截屏 用于检查元数据和发布应用程序的precheck & deviler 安装 要使用fastlane,需要先安装XCode和自制软件。 $ xcode-select –install#确保最新的XCode命令行工具 $ brew cask安装fastlane 建议将Gemfile用于Fastlane依赖项。 同样,它将加快fastlane。 $ sudo gem install bundle 在项目的根目录中创建具有以下内容的Gemfile: source “https://rubygems.org” gem “fastlane” 然后运行: $ 捆绑包更新 将Gemfile和Gemfile.lock都添加到版本控制中。 导航到项目的目录并运行。 $ bundle exec fastlane init -u Fastlane将生成一个基本配置,并从iTunes Connect获取现有配置(如果有)。 结果将创建包含Appfile和Fastfile的 ./fastlane目录。 Appfile可能看起来像这样。 app_identifier “ com.datarockets.CoolApp” apple_id “您的苹果ID” […]

解决LeetCode中的问题对我有什么帮助?

几周前,我启动了我的第一个iOS应用程序,它具有关于Swift的非常基础的知识,这些知识是我通过一些教程和主要是Apple文档中学到的。 但是后来,我对任何编程语言都不了解,几乎所有在Swift中学到的东西对我来说都是新的。 掌握了基本数据类型,条件语句和循环的新手知识之后 ,我开始使用Swift进行编码。 在开发应用程序的过程中,我学习并使用了某些iOS SDK和库。 随着我的知识的增长,它主要取决于应用程序开发本身,而很少涉及编程概念。 这里要具体说明数据结构和算法。 我在应用商店中发布了我的应用。 在与朋友一起审查该应用程序并谈论其可扩展性时,我了解到我还有很多东西要学习。 不仅是编程语言,数据结构和算法,还涉及解决问题的方法。 我相信通过经验学习,这样我才能更快地学习,解决现实生活中的问题并保持动力。 因此,我一直在浏览有关我应该学习什么以及应该如何开始的网站,并且对初学者学习编程的所有不同选择感到非常困惑。 幸运的是,我的一个朋友向我介绍了Leetcode。 LeetCode是一个平台,允许任何人以越来越困难的方式解决编程问题。 当我开始解决问题时,我觉得LeetCode是一个很好的平台,可以提高您在解决问题和编码方面的技能 。 它支持Swift,因此我也可以掌握编程语言,最终帮助我更快更好地构建iOS应用。 LeetCode 提升您的编码技能,并迅速找到工作。 这是扩展您的知识并做好准备的最佳场所。 leetcode.com 如何开始解决问题的实践: 首先,对要学习的东西有个目标 。 对我而言,这是使用正确的OOPS概念编写更好,更简洁的代码,并对数据结构和算法有深入的了解。 从简单的事情开始,这样您就会获得信心。 然后逐步解决中/硬问题。 尝试在40分钟内解决 。 如果找不到解决方案,请查看提示,然后继续。 当您开始感到更加自信时,请减少时间。 如果您不了解某些内容,请不要犹豫 。 当我说Google时,请不要用Google搜索问题本身。 Google会根据您的想法解决问题,并了解如何实施这些想法。 对于数据结构(DS)学习 ,首先列出要保留的数据结构 。 然后阅读有关google,GeeksforGeeks等中的内容的信息,一旦您掌握了一些知识,请先使用您选择的编程语言来实施DS ,然后再使用DS解决问题。 然后在LeetCode中搜索数据结构的实现问题。 解决该问题的方法有助于我理解如何将特定类型的数据结构应用于问题。 测试您的代码并提交 。 如果您的代码没有通过,请不要放弃。 尝试修复错误,直到正确为止。 LeetCode的主要学习成果: 了解面向对象的编程。 更好地解决问题 。 开始掌握时间和空间的复杂性 。 了解哈希表和B树 。 […]

彗星:Swift中的动画粒子

CAEmitterLayer仅指定粒子的起点。 要更改粒子的外观,我们必须看一下CAEmitterCell。 CAEmitterCell CAEmitterCell是CAEmitterLayer发射的粒子的模板,并确定其外观和移动方式。 CAEmitterLayer具有一个或多个CAEmitterCells数组,每个可能具有不同的配置和样式。 要更改粒子的外观,可以使用CAEmitterCell的以下属性: 内容 单元格的内容需要PNG图像文件作为粒子的基础。 该图像将用于确定粒子的形状。 最好使用白色图像,因为视觉属性会为其着色。 视觉属性 设置内容后,视觉属性可以更改粒子的颜色和比例。 也可以设置颜色的RGBa值的速度和范围。 色速定义了颜色在单元生命周期中的变化方式,范围指定了每个新生成的粒子之间颜色成分可以变化的量。 运动属性 运动属性可以使细胞旋转,并确定粒子发射角的方向。 就像颜色范围一样,发射范围可以改变每个新生成的粒子之间的发射角度(以弧度为单位)。 例如:上面显示CAEmitterLayer形状的GIF显示出2π的发射范围,这使得粒子可以在任何方向上生成。 时间属性 这些属性涉及与时间相关的任何事物,包括寿命,出生率(每秒粒子数),粒子的速度和加速度。 让我展示一个示例,说明四个不同的单元格可能是什么样的: 太酷了吧? 创建线条和彗星 现在,我们对粒子在iOS中的工作方式有了基本的了解,让我们看看Voicy中的线条和彗星。 画一条线 画一条线很简单。 您只需要两个坐标,一个颜色和一个宽度。 和繁荣! 就这样,你有一条线。 我创建了一个LineModel结构,该结构具有坐标和线条颜色的属性。 一个简单的drawLine()函数返回一个CAShapeLayer,可以将其添加到UIView来绘制两个坐标之间的线: struct LineModel { var startPoint:CGPoint var endPoint:CGPoint var lineColor:UIColor func drawLine()-> CAShapeLayer { //创建路径 让linePath = UIBezierPath() linePath.moveToPoint(startPoint) linePath.addLineToPoint(endPoint) //将行创建为CAShapeLayer 让lineLayer = CAShapeLayer() lineLayer.path […]

我刚开始学习iOS时希望有人告诉我的5条提示

由Johann Kerr | SWARM开发人员 考虑进入iOS应用程序开发领域,但不确定从哪里开始? 你不是一个人。 该过程可能令人生畏,尤其是在从多种语言,框架和最佳实践中进行选择时。 如果您需要一些建议以帮助您快速开始学习,或者需要一些鼓励以保持势头,那么这里有5个提示。 提示1:学习Objective C和Swift。 如果您想为iOS编程,但又不能决定要学习Objective C还是Swift,请不要浪费时间,不要仅仅因为它更简单而选择Swift。 虽然目标C已有25年历史,但现实是它不会很快消失。 许多公司仍然在Objective C中有代码库,许多iOS和OS X框架都是用Objective C编写的。如果仅学习Swift,就会处于不利地位。 此外,同时学习两者将使您成为更好的开发人员。 当我第一次学习为iOS编程时,我不必选择一种语言,因为Objective C是唯一的选择。 我记得很不情愿地步履蹒跚,发现它是一种丑陋,令人沮丧的语言。 Swift在2014年6月问世时,我立即为找到一种更快,更直观的语言而感到欣慰。 我爱上了Swift简洁明了的语法(即,不需要用分号分隔语句),并赞赏了它与Obj-C相比的许多优点,例如其简洁性,速度以及处理内存管理的能力。 Swift中的编码使我更容易学习和体验快速看到工作成果的快感。 不用说,我立即跳船,没有回头。 …直到我开始在SWARM工作并意识到目标C仍然很重要。 尽管Swift似乎是大多数项目的首选语言,但我们确实会使用现有应用程序来吸引客户,并且这些应用程序通常是用Objective C进行编码的。此外,遗留库也位于Objective C中。我发现自己按顺序浏览了旧教程赶上我原本会迷路的语言。 因此,请帮自己一个忙,同时学习Objective C和Swift。 您永远不知道何时需要它。 尽管Swift可能是未来,但我们还不能放弃ObjectiveC。 提示2:情节提要,笔尖或代码? 学习全部三个。 当我第一次学习如何为iOS编程时,我观看的每个视频教程都使用Storyboard来布局多个应用程序视图以及它们之间的过渡。 结果,我习惯了在每个项目中都使用Storyboard,并避免以编程方式创建视图,因为Storyboard似乎是标准。 甚至我也忽略了使用Nibs(或Xibs),因为Storyboard似乎囊括了所有使用Nibs的优点。 但是,当我从SWARM开始时,我很快就了解到故事板不一定是通过iOS应用程序以图形方式显示用户路径的最佳方法。 我必须努力学习这一点,因为刚开始我要负责开发新的Apple tvOS,并且每当我尝试触摸Storyboard时,Xcode beta都会崩溃。 我意识到我的团队没有使用情节提要,而是使用原始代码构建了几乎所有项目视图。 故事板非常适合小型项目以及处理诸如主从视图集或用于身份验证和注册的视图集之类的事情。 与团队一起处理较大的应用程序时,情况并非如此。 大型情节提要板可能难以浏览和维护,并且在多个开发人员需要处理同一文件时变得更加困难。 想象两个或两个以上的开发人员试图创建视图并同时提交? 考虑版本控制冲突。 kes! 现在,我在SWARM工作了近10个月,我开始欣赏以编程方式精心布置iOS应用程序所带来的美丽和简单。 尽管它可能需要一些额外的击键,但它使我可以完全控制自己的创作。 我的建议:学习故事板,笔尖和代码以创建视图。 它不仅可以为您遇到的任何类型的系统做准备,还可以使您认真思考布局视图的方式以及如何在不同屏幕上重用这些视图。 提示3:不要仅仅依靠椰子。 DRY“不要重复自己”是程序员之间为避免重复代码而使用的常见开发格言。 […]

更好地编码的简单技巧(Swift iOS)

大家好,今天我决定写一个关于我认为非常重要的“提高编码技巧”的话题。 我认为这很重要,因为Swift为我们提供了许多有趣的工具,以避免在创建应用过程中出错,但是我们大多数人(一开始)通常都不使用它们。 并相信我,他们将节省很多问题。 请别再哭了。 避免使用字符串-使用枚举 如果您使用其他语言,则可能知道什么是常量,如果您不这样做: 在计算机编程中,常数是程序在正常执行期间无法更改的值 枚举是保持所有常量井井有条的方式,例如: enum Countries:String { case usa case colombia case mexico case germany } 现在,我请您考虑如何在oder中比较字符串变量以显示正确的标志。 let country =“哥伦比亚” 如果国家==“哥伦比亚” { } 如果国家==“哥伦比亚” { } 如果国家==“德国” { } 此过程可能会在您的应用程序中产生很多错误,因为通常开发人员在输入时可能会犯错。 列举救援 let country =“哥伦比亚” 如果国家== Countries.colombia.rawValue { } 通过上面的代码,您将非常确定自己正确地输入了条件。 创建面向可重用性的类 尽管这可能是有史以来最明显的建议,但可以再说一遍: 可重用性 没有人喜欢长代码文件,它们很无聊,难以阅读,实际上,当所有文件都弄乱了时,在文件中工作很烦人。 如果您有这样的事情: 覆盖func viewDidLoad(){ super.viewDidLoad() 让shadowPath = UIBezierPath(rect:self.view.bounds) 让borderView […]