Tag: swift

UIImagePickerController

所以我决定在我的第一个博客中展示他们为我们提供的Apple出色的UIKit UIImagePickerController。 最终,我们将要从事一些项目,而我们自己的一些副项目将需要某种形式的图像,无论是提供信息还是使您的应用程序漂亮。 UIImagePickerController是一个类,它使我们可以访问照相机设备和照片库并将它们显示在我们的故事板上。 下面提供了有关如何使用类似的方式从图库中获取照片的链接: 视频中有一个部分让我感到非常困惑,其中大部分我都不知道为什么要写: @synthezise imageView // imageView的属性 @synthesize imageController; // imageController的属性 显然,@synthesize会为您的属性生成getter和setter方法。 我没有使用这种编码方式,而是创建了一个新的UIImagePickerController实例。 现在好玩开始xP 对于按钮操作,我们需要使用内置视图从库中选择想要的图像。 因此,我们首先基本上制作了UIImagePickerController类的新实例。 我们将代表设置为self,并展示了视图控制器(这是我们的照片库)。 -(IBAction)buttonToGetImage:(id)发送者 { UIImagePickerController * imageController = [[UIImagePickerController alloc] init]; imageController.delegate =自我; [自己的presentViewController:imageController动画:是完成:无]; }

IOS应用生命周期

每个iOS开发人员都应了解应用程序生命周期。 应用程序生命周期有助于了解整体应用程序行为。 进入iOS应用的主要要点是UIApplicationDelegate 。 UIApplicationDelegate是您的应用必须执行的协议,以获取有关用户事件(例如,应用启动,应用进入后台或前台,应用终止,推送通知已打开等)的通知。 应用程序生命周期示例: 启动iOS应用程序时,第一件事是 应用程序:willFinishLaunchingWithOptions:-> Bool 。 此方法适用于初始应用程序设置。 此时,情节提要板已经加载,但尚未发生状态恢复。 发射 应用程序:didFinishLaunchingWithOptions:->接下来调用布尔 。 当应用程序完成启动和还原状态时,将调用此回调方法,并且可以执行最终初始化,例如创建UI。 在应用程序:didFinishLaunchingWithOptions:之后,或者如果您的应用程序在接到电话或其他系统中断后再次变为活动状态,则调用applicationWillEnterForeground : 。 在applicationWillEnterForeground:之后调用applicationDidBecomeActive:以完成到前台的过渡。

内存管理简介

我用objective-c编写程序,并一般地编程,我发现自己在问一个问题:“所有这些对象会发生什么? 他们去哪里? 这些问题的答案通常是内存,或更具体地说是内存管理。 根据调用对象的时间以及是否需要它们来创建和销毁对象。 我发现您的计算机可以通过两种不同的方式来管理内存:ARC vs MMR。 ARC —简短摘要 首先,让我们谈谈ARC,也就是自动引用计数。 内存管理是一项非常单调的任务,因此ARC负责处理程序中所有必要的烦人方法调用。 它的工作效率非常高,并为开发人员提供了更多时间来处理其项目中更重要的方面。 更不用说减少代码量和保持可读性。 MRR-这是什么? MMR代表“手动保留释放”,通常您不需要担心。 但是,稍微试用一下以了解计算机在幕后如何运行以及做什么(可能会感觉到在ARC之前进行手动内存管理的痛苦)可能是有益的。 单击项目导航器中的项目图标,确保选择了“构建设置”选项卡,然后开始在搜索栏中键入自动引用计数。 应显示“ Objective-C自动引用计数”编译器选项。 将其从“是”更改为“否”。—从Ry的Objective C内存管理教程中 创建对象并保留控制权 我们都使用过alloc,但是也许您想知道它到底在做什么? 好吧,当您编写一个新的类文件时,您实际上并没有在创建对象……而是在编写如何创建该对象的蓝图。 正如您可能自己发现的那样,只有当您实际调用方法或类时,任何事情都完成。 那么,当我调用一个类的实例时会发生什么? 确切地说,您创建了可以修改的对象实例。 例如,当您调用alloc类方法时,您是在告诉计算机您正在创建要声明其所有权的对象。 这告诉计算机“哦,太好了,有1个物体飞到了! 全是你的!”。 但是,问题是在使用完该对象后将其放置在身边。 就像一个孩子遗弃玩具供所有人踩踏一样,如果遗留下太多“玩具”,计算机将跳闸。 进入内存管理-如前所述,当您创建过多的对象实例而没有正确处置它们时,计算机会遇到称为内存泄漏的情况。 如果不加以检查,尤其是在循环中创建太多对象的情况下,这会造成问题,因为这将耗尽所有可用内存并导致项目崩溃。 这导致我们讨论如何处理这些对象。 内存管理方法 上图显示了内存管理所需的方法调用,以及在编写项目时ARC自动使用的方法。 自动发布与发布 关于内存管理,自动释放告诉计算机放弃对某个对象的所有权,但是将其破坏推迟到程序完全确定可以安全地破坏它之前。 本质上,您的程序只是一堆指向引用的指针,而自动释放功能可确保在销毁给定对象之前不留任何指向该对象的指针。 Release告诉您计算机已完成创建的对象的处理,然后立即销毁它,这可能会在以后产生效率问题,尤其是在有其他调用对象的情况下,因此需要重新创建。 不断地重新创造/破坏物体就像将它们留在身边一样低效。 结论 内存管理最重要的方面是它是一种平衡行为。 必须创造的东西,最终也必须销毁。 对于现代计算机,内存泄漏相对来说是微不足道的,但是如果您没有按照预期的方式适当地管理内存,则最终可能会导致效率低下或程序运行缓慢。 整体内存管理是一个有趣的话题,但涉及到的深度也很大。 一般而言,我只对内存管理进行了初步调查,但是将来一定会做更多的研究,因为学习它的复杂性肯定有其价值。 希望您喜欢阅读。

如何将tvOS旋转为纵向模式

继续讨论其他一些小众话题,让我们看一下如何旋转tvOS应用程序以在纵向模式下工作。 因此,在tvOS中什么是“肖像”,那么……从SDK角度来看,这个概念就不存在了。 iOS中没有任何与旋转相关的方法可以将其转移到tvOS,这是有充分理由的。 话虽这么说,仍然有一小段有用的tvOS应用程序以比垂直空间更多的垂直空间呈现。 Panic的状态板应用程序就是一个很好的例子,该应用程序是在2013年使用iPad制造的,iPad最好安装在所连接电视的背面。 当然,您也可以使用此选项,但是对于我们的用例和本文的主题,我们将坚持使用tvOS作为平台。 在尝试解决此问题之前,我们经过了漫长而艰辛的思考,我们如何才能做到这一点,并在将来保持应用程序可维护。 引起人们的第一个担心是,这将影响我们编写约束的方式,必须在编写代码之前先将布局转换为头脑。 这感觉就像是一个无法忍受的情景,是如此难以忍受,以至于我们几乎决定完全放弃肖像的想法。 在就如何最好地解决此问题进行了小型头脑风暴之后,我们想到了下降到层次结构中最低(或最高)点,更具体地说是应用程序窗口的想法。 如果交换宽度和高度,则最终得到正确的帧尺寸。 但是,窗口现在放错了位置。 这是我们的好朋友改造进入并保存一天的地方。 我们要做的第一件事是使旋转正确,对于我们的用例,我们必须将屏幕旋转-270度。 这可以通过CGAffineTransform轻松完成。 瞧,现在我们可以正确旋转屏幕了。 但是,屏幕现在有些放错了位置。 为了固定位置,我们需要将另一个变换应用于窗口,这是x和y坐标的平移。 这些值很容易计算,只需将宽度减去高度再除以2,对y位置进行相同操作,但取反即可。 然后,我们通过调用.concatenating创建转换并将其应用于我们已经存在的旋转转换。 使用此方法,我们可以将两个变换合并为一个,最后将其应用于窗口。 就在那里 该应用程序的窗口现在使用的是纵向窗口大小,已经旋转并定位为适合电视屏幕的中间位置。 更重要的是,您现在可以使用与通常应用于视图的约束类型相同的约束,而不必考虑屏幕旋转的问题。 除了过分扫描时我想强调的一个小细节。 在tvOS人机界面指南中,Apple提到应该至少将60个用于顶部和底部插图,将90个用于左侧和右侧插图。 现在,您已经旋转了电视屏幕,在处理过扫描时,应该将这些值反转为安全起见。 因此,顶部和底部为90,左侧和右侧为60。

Swift中的错误处理

错误处理是响应程序中的错误情况并从中恢复的过程。 Swift支持在运行时引发 , 捕获 , 传播和操作可恢复错误的方法。 在Swift中处理错误的四种方法是: 1.使用throwing函数传播错误:在函数的参数后的声明中使用关键字throw表示函数,方法或初始化程序可以引发错误。 标有throw的函数称为throwing函数 。 enum errorType: Error { case errorOne } var errorOne: Bool = true func throwingFunction() throws{ if errorOne { throw errorType.errorOne } } do { try throwingFunction() } 2. 使用do-catch语句处理错误: do-catch语句用于通过运行代码块来处理错误。 如果do子句中的代码引发错误,则将其与catch子句匹配,以确定其中哪个子句可以处理该错误。 do { try throwingFunction () } catch errorType.errorOne { print(“Invalid Value”) } 3. 将错误作为 […]

使用Kitura的Server Side Swift入门

服务器端Swift在iOS开发社区中正在蓬勃发展,现在是时候打破其他编程语言和框架的束缚,并以我们心爱的Swift语言实现一切。 有几种服务器端Swift框架可用,但最受欢迎的三个框架如下: 汽 Kitura 完善 有时我介绍了Vapor框架。 这篇文章讨论了如何开始使用Kitura,Kitura是IBM的服务器端Swift框架。 先决条件: Xcode 8或以上 斯威夫特3.0 使用Swift Package Manager安装Kitura软件包: 第一步是使用Swift Package Manager安装Kitura软件包。 在此之前,您需要初始化Swift Package Manager。 创建一个名为“ hello-kitura”的文件夹,然后使用终端进入该文件夹。 一次,在文件夹中初始化Swift软件包,如下所示: 运行“ swift build”命令来构建代码,如下所示: 构建完成后,您可以使用以下命令运行可执行文件。 世界您好! 当您执行代码时,它将在“ main.swift”中运行所有代码。 如果打开“ main.swift”文件,则会发现以下代码行。 打印(“ Hello World”) 这确认您的包已成功初始化。 现在打开您的Package.swift文件,其中包含您需要在应用程序中使用的所有软件包。 默认情况下,Package.swift将包含以下代码行。 导入PackageDescription 让包=包( 名称:“ hello-kitura” ) 如此,您可以看到Package.swift文件没有引用任何包或依赖项。 让我们对其进行修复,并添加对Kitura项目的依赖。 除了Kitura,我们还添加了对HeliumLogger的依赖。 HeliumLogger用于记录从Kitura生成的事件,对调试请求非常有帮助。 对Package.swift文件进行上述更改后,跳至终端并运行以下命令。 快速构建 这将触发构建并下载Package.swift文件中包含的所有依赖项。 一切完成后,您可能会看到类似以下内容的内容。 最后一步是生成Xcode项目,以便您可以在自己喜欢的编辑器中开始使用Kitura应用程序🙂 迅捷包generate-xcodeproj 这将生成Xcode项目。 您可以使用以下命令从终端打开Xcode项目。 […]

如何使用CocoaPods创建您的私人图书馆(Pod)

凉!! 现在尝试构建您的项目,并检查是否有任何与swift 3相关的问题,然后转到下一步。 检查Podspec文件 在将Podspec文件提交到我们的私有存储库之前,我们可以通过运行以下命令从项目目录进行测试: 将摘要更改为: 接下来,浏览至Github或Bitbucket并为我们的库创建一个私有存储库,然后跳过给定的URL。 初始项目设置的下一步是提交更改并将所有内容推送到您创建的GitHub或Bitbucket远程存储库。 以下步骤可以解决问题: 假设一切顺利,我们可以将更改最终提交到存储库,创建标记并将其推送到存储库。 如果一切顺利,您现在已经准备好一个由Git源代码控制的Snorlax库项目。 现在,您可以为该项目创建CocoaPod podspec,并继续开发支持CocoaPod的库项目。 设置规格仓库 即将进行的所有设置都将获得回报,因为您将拥有一个既定的,可重复的过程,可以为iOS应用开发设置内部库。 根据需要添加更多的私有共享库变得很简单。 登录到Github或Bitbucket并创建一个名为PrivateTrunk的新私有存储库来管理所有私有库。 接下来,使用新创建的URL运行以下命令: 部署库 最后一步是将Podspec推送到专用中继服务。 您可以通过从命令行执行以下命令来执行此操作: 使用图书馆 就是这样,现在您应该可以通过编辑podfile,在顶部添加私人仓库的源代码和标准cocoapods 源文件的方式来安装库。 正常添加库。 摘要 阅读完本教程后,希望您现在了解如何创建自己的私有库。 作为参考,您可以从此处下载完整的Xcode项目 。 与往常一样,给我评论,分享您对本教程的看法,不要忘记关注我以获取更多教程。

带标签栏控制器的RxSwift

今天,我们将讨论如何在Tab Bar Controlled应用程序中实现RxSwift,并了解响应式编程的魔力🙂 我将尝试尽可能详细地解释RxSwift的基础。 让我们转到RxSwift的github repo并将其安装在我们的应用程序中。 我将项目命名为RxSwiftExample,并且将使用cocoapods将其安装为: #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0’target’RxSwiftExample’做 #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks! pod’RxSwift’,’〜> 4.0′ pod’RxCocoa’,’〜> 4.0′ #RxSwiftExampleend的广告连播 现在转到情节提要,然后将ViewController嵌入到选项卡栏控制器中。 然后将另一个ViewController添加到场景中。 控制从选项卡栏控制器拖动到新的vc,并将关系设置为视图控制器。 然后为标签栏项目提供一些随机项目,以便可以在标签栏中进行区分。 (我将使用“更多”和“搜索”标签栏项目) 到目前为止,您的情节提要应该看起来像这样: 创建一个UIViewController的可可触摸类,并将其命名为UserViewController.swift,并在情节提要中将新的vc的Class设置为UserViewController。 由于本文将主要关注RxSwift,因此我不会花太多时间来解释UI组件,约束等。 然后从对象库中拖动一个表视图并插入到User vc中,为其赋予0–0–0–0约束。 然后转到属性检查器,并给其提供原型单元格,其标识符为“单元格”。 控制从tableView拖动到vc,并设置其数据源和委托属性。 打开助手编辑器,然后将控件从表视图拖动到UserViewController.swift并作为tableView进行引用。 然后在第一个vc中添加三个标签,对其施加一些约束,打开助手编辑器,并从情节提要中获取对nameController,ageLabel,cityLabel的引用,以指向故事板。 现在该创建模型了。 创建一个名为User的快捷文件,然后复制下面的代码。 现在该使我们的应用程序更有趣了。 转到您的UserViewController并在课程开始时在下面声明变量 var userToShowInFirstVc =变量(用户(名称:“ Alex”,年龄:25,城市:“慕尼黑”))var userToShowInFirstVcObservable:Observable { 返回userToShowInFirstVc.asObservable() } var userArray =变量([User]())var userArrayObservable:Observable { 返回userArray.asObservable() } 在这里,我们创建了两个变量及其可观察对象,分别为userToShowInFirstVC和userArray,第一个是用户变量,我们将在第一个vc中显示其详细信息。 我们以用户Alex作为占位符用户开始。 userArray是由Users组成的数组。 我们将使用来自userArray的用户填充tableView。 让我们创建一个将Users添加到我们的userArray的方法: 由于我们的userArray也是RxSwift变量,因此当我们想要进行更改或获取其引用时,我们需要以userArray.value的形式获取它的值。 […]

带有Sprite Kit的过程图块贴图

我最近开始了一个新项目:建立一个城市建筑/模拟游戏。 我想使用SpriteKit及其SKTileMapNode类创建程序性地形。 我开始在网上寻找并阅读文档,但是关于如何以编程方式进行操作的内容并不多。 因此,我决定写本教程系列,介绍我在构建新游戏时所学的知识。 首先,按程序创建基本的瓷砖网格! SpriteKit和图块 苹果公司创造了一种非常简单的方法来管理一整块瓷砖及其在SKScene中的放置,但是,这不允许我们(至少不是我发现的)以程序方式生成我们的瓷砖地图。 因此,我们必须更深入地研究它们的实现。 首先,让我们使用“游戏”模板创建一个新的Xcode项目,并将引擎设置为SpriteKit。 接下来,我们添加一个Apple的默认图块集。 所以我们去File-> New-> File。 然后转到“资源”部分,然后选择“ SpriteKit Tile Set”。 然后选择您要查找的任何图块类型(Apple支持Grid,Isometric和Hexagonal),在此示例中使用哪种类型都没关系。 这将创建一个SKTileSet,其中包含所有平铺图像。 然后将集合分成不同的SKTileGroups。 这些组将是不同的地形,因此水,草,沙等。在这些组中是SKDefinitions,它们定义了放置瓷砖的位置。 我们现在不需要为此担心很多,但有关更多信息,请参见WWDC 2016视频:“ SpriteKit的新功能,Session 610”。 GK噪声 该地图最重要的部分是它是按程序生成的,为了做到这一点,我们将使用GKNoise创建一个“地图”,以说明我们如何布局平铺的世界。 苹果有几种不同类型的预建噪声源(GKNoiseSource),但是对于我们的用例,我们将使用GKPerlinNoiseSource。 此来源旨在为我们提供自然的地形。 func createNoiseMap()-> GKNoiseMap { //获取我们的噪声源,可以进一步自定义 let source = GKPerlinNoiseSource()//使用我们的源代码初始化GKNoise对象 let noise = GKNoise.init(source)//创建地图, // sampleCount =到网格中的图块数(行,列) let map = GKNoiseMap.init(噪声,大小:vector2(1.0,1.0),原点:vector2(0,0),sampleCount:vector2(50,50),Seamless:true) 返回地图 } 首先,我们基于GKPerlinNoiseSource创建噪声源。 然后使用我们的源代码创建一个新的GKNoise对象。 最后,我们使用该噪声对象创建地图。 确保将sampleCount参数设置为与稍后将用于SKTileMapNode的行和列数相同的数量。 […]

我如何使用UIAppearance管理我的应用主题(第1/2部分)

在第一部分中,我将解释动机,方法和定义我使用的对象。 在第二部分中,我将更深入地研究与UIKit API交互的ThemeManager对象及其在应用程序中的使用方式。 最近,我添加了更改应用程序“电视流”主题的可能性,这是最终结果: 为了以一种容易,可维护和可自定义的方式进行操作,我使用了UIKit中的UIAppearance。 该协议具有一些方法,这些方法使您可以更改几个UIKit组件的外观,例如UINavigationBar,UIBarButtonItem等。 此外,您可以对其进行自定义,以便仅当该组件包含在其他组件类型中时更改外观。 由于视图遵循树结构,因此当UIBarButtonItem位于UINavigationBar或UIToolbar内部时,可以选择具有不同的外观。 阅读完Apple文档后,我发现Ray Wenderlich的教程和Abhimuralidharan的教程很有用。 我还以Siesta示例应用程序中的代码为起点。 我使用以下对象来管理主题: ThemeName (枚举):以独特的方式列出所有可能的主题; 主题 (协议):定义定义主题所需的所有属性; LightTheme,DarkTheme,BlackTheme (结构):符合主题协议并实现主题变体; ThemeRepository (协议):摘要如何加载和保存主题; DefaultsThemeRepository (类):使用标准的UserDefaults保存和加载主题; ThemeManager (类):返回当前主题并应用不同的主题,使用存储库检索当前主题并保存所应用的主题;