应用开发简介

有一个应用程序 关于成为一名程序员,我比其他任何人都被问到的问题是“嘿,兄弟,我想学习制作应用程序,我应该从哪里开始?”或其他形式的变化。 一旦有人开始学习某种语言或希望开始学习某种语言,那么可能出现的第一件事就是我如何使用已经获得/将要获得的编程技能来创建可以向人们展示的应用程序。 这个问题的问题在于它太模糊了。 自苹果发布首款iPhone并带来“应用程序”概念以来,已经过去了将近10年,该应用程序可以部署在可在操作系统上运行的“应用程序商店”上。 在整个应用程序革命之前,操作系统上运行的所有内容通常都被称为软件或应用程序。 而且它不像应用程序开发那么出色。 随着智能手机及其操作系统(如Android和iOS)的疯狂成功,您开发的应用程序将在全球数十亿拥有智能手机和互联网连接的人的手中。 通过应用商店,您可以为应用设定价格,或者使用应用内购买或仅需几行代码就可以包含在应用中的广告,使这些应用获利也变得非常容易。 这意味着成为“应用程序开发人员”实际上是一种可行的职业,可以为您提供稳定的收入来源。 随着越来越多的新程序员加入到越来越多的应用程序开发人员队伍中,应用程序已经从完成了计算器或气象应用程序之类的小型应用程序,发展成为令人难以置信的复杂软件,可以完成从叫车到打车的所有工作。您可以与您的朋友联系,打电话给您的家人到世界一半的地方,甚至可以监控您的健康状况并帮助找到治疗癌症的方法。 这意味着整个应用程序生态系统还刺激了对其他相关业务(如服务器后端,数据存储解决方案和IDE的实际编码)的需求。 这是苹果公司针对iPhone的广告,其中大量的应用程序是他们的主要卖点 因此,现在回到如何制作应用程序这一主题,您将需要做出许多决定: 我正在开发什么样的应用程序? 会是游戏吗? 还是可以帮助人们更有效地完成工作的工具? 还是它将成为人们的交流平台? 我要在哪个平台上分发它? 将用于网络吗? 还是用于移动设备? 如果用于移动设备,则使用哪个平台,Android,iOS或Windows Phone? 会是跨平台的吗? 我擅长什么语言,我需要学习什么语言? 我是否具有为要构建的平台编程所需的硬件和软件? 在找到上述问题的答案之后,您将有良好的基础开始在该应用程序上进行实际工作。 现在,所有应用程序的构建方式都不相同,每个类别的工作流程略有不同。 让我来看看其中的一些。 我通过学习HTML,CSS和javascript开始编程。 这些语言是现代网络的基础,对于开始编程的人来说,它们是非常好的“网关语言”。 这是因为所有这些语言的入门门槛都非常低,可以容忍初学者程序员犯的常见错误,并且它们是一些最受欢迎的编程语言,因此在互联网上无处不在。 诸如堆栈溢出之类的网站上充斥着有关这些语言的信息,您真正面临的问题很可能已经由堆栈溢出的真正有用的社区解决,您所需要知道的只是外观。 现在,按照他们的传统常识,没有人会认为这些语言中的任何一种都是您用于应用程序开发的语言,但是您会感到惊讶。 Web应用程序或在浏览器中运行的应用程序仅使用这些语言编写,现在甚至可以在Node.js的帮助下使用JavaScript编写后端服务。 这些应用程序既可以托管在您的服务器上(例如web.whatsapp.com或inbox.google.com),也可以使用Chrome网络应用商店打包和部署,这些应用程序使chrome浏览器的用户即使在离线状态下也可以使用该应用程序, chrome图书(我听说你很窃笑,但chromebook的销量仅次于macbook,并且由于其极低的价格而增长很快)是它们唯一的应用程序来源。 您还可以使用phonegap / Xamarin / Titanium mobile等服务在移动设备上分发基于Web的应用程序。 这绝对不适用于所有类型的应用程序,因为网络应用程序的性能受到严重限制,它们的本机功能也是如此,例如对指纹读取器,蓝牙和其他网络功能的正确访问。 以下是您可能需要在此处开始的一些事项: 一个好的文本编辑器: 很多人可能只对终端上的VIM或emacs甚至记事本感到满意。 但是许多其他文本编辑器为表带来了很多好处,例如代码突出显示,代码建议,自动完成,花括号完成等。 我会推荐的一些非常好的工具是Notepad ++,Adobe Brackets,Sublime和Github Atom。 最后,文本编辑器的选择完全由您决定,您应该选择最适合自己的一种。 节点程序包管理器(NPM): 在下载软件包及其依赖项时,这是一个非常宝贵的工具,在为您的项目下载工具和库时,它将真正为您提供帮助。 […]

在没有CocoaPods的情况下将React Native添加到现有的iOS项目中

由于多种原因,您可能会发现自己想要将React Native添加到现有的iOS项目中而不使用CocoaPods。 CocoaPods是一种用于自动将第三方库添加到项目中的过程的工具,但是没有理由在情况需要时不能手动执行此操作。 注意,这假设您已在本地存储库内的node_modules文件夹中将 React Native下载为依赖项。 有关如何将React Native作为依赖项添加到项目的示例,无非是使用react-native init或UIExplorer项目创建的任何项目(包括在react-native Github存储库的Examples目录中)。 将React Native的子项目添加到您自己的项目中 默认情况下,新创建的React Native项目包括以下子项目。 我建议您在项目中创建一个组,以在Xcode中将这些子项目添加到其中,右键单击它,然后选择“将文件添加到YOUR_PROJECT_NAME ”。 然后,您可以添加React项目本身(位于node_modules / react-native / React中)和所有其他React Native子项目(位于node_modules / react-native / libraries中)。 将二进制文件与库链接 为了编译我们的项目,我们必须将我们的项目目标与第三方的React Native库链接; 在这种情况下,我们的项目目标是“ UIExplorer”。 注意,如果您正在使用位于任何React Native子项目中的类的任何目标,则必须将受关注的库与所讨论的目标链接。 导航到Build-phases-> Link Binary With Libraries添加以下库。 注意,在这种情况下,库是静态链接的。 “其他链接器标志” 如果您尚未设置以下链接器标志,则有必要添加它们以在项目中编译React-Native。 标头搜索路径 如果您使用的React Native版本低于0.40,则有必要向项目添加一些其他标题搜索路径 。 从0.40开始,由于在React Native项目中添加了“ copy headers”阶段,因此没有必要。 这些标头可以包含在系统包含(’s)中,因为标头本身将与其他系统标头一起位于特定目录中。 在您使用的React-Native版本低于0.40的实例中,您需要在项目的标题搜索路径中添加以下内容; 这告诉编译器可以在哪里找到React Native头文件。 注意,添加的路径应相对于node_modules目录。 希望信息对您有所帮助。 […]

如何在Mac上正确卸载应用

卸载Mac应用程序是最简单的操作。 您只需从应用程序文件夹中选择要卸载的应用程序,然后将其拖到垃圾桶中,然后清空垃圾箱中提琴即可! 你完成了。 您可能想知道为什么我在这里告诉您呢? 这是一个很好的问题。如果我告诉你,你一直做错了怎么办? 应用程序具有支持文件和相关性,当您简单地将应用程序拖放到垃圾箱中时,您不会完全删除其支持文件并缓存文件,这就是我在这里向您展示的内容。 我将展示如何清理应用程序支持和缓存文件。 使用App Cleaner删除支持文件 如果您的Mac上未安装App Cleaner ,请转到mac应用商店并进行安装。 它是完全免费的。 安装应用程序清洁器后,将其打开, 首次打开应用程序清洁器时,它将在Mac中显示所有安装的应用程序及其内存大小。 选择要卸载的应用程序,它的应用程序支持文件,缓存和首选项文件将显示在右侧。 勾选右侧的所有文件 ,然后按“ 删除服务”文件 ,然后按“ 删除”进行确认 这将删除该特定应用程序的所有支持,缓存和首选项。 毕竟,现在您可以将应用程序拖到垃圾桶中并清空它。 手动清理支持的应用程序并缓存文件 如果您不想使用第三方应用来清理您的Mac,那不是火箭科学,您可以手动完成。 让我们开始吧。 单击Mac屏幕左上方的apple徽标,然后选择“关于此mac”。 然后选择存储。 这将显示Mac上的可用和已用内存空间。 在右上角,您将看到一个名为管理的按钮,单击它。 这将打开文件浏览器。 这将打开系统信息窗口。 从窗口: 选择文件 点击文件浏览器 转到应用程序支持文件 查找与您要卸载的应用程序相关的文件夹,并将该文件夹放入回收站。 重复#3和#4,您需要第二次访问缓存而不是应用程序支持文件。 从“ 应用程序支持和缓存”文件中清除与要卸载的应用程序相关的所有文件之后,现在可以将要卸载的应用程序拖到垃圾箱中并将其清空。 仅此而已,现在您可以从Mac正确卸载应用程序。 如果单击本教程,请鼓掌。

自学成才的软件开发人员:为什么开源对我们很重要

这是一个关于我对开源的看法如何随时间变化以及如何对我的职业生涯产生帮助的故事。 开源简介 大约13年前(在高中时),一个朋友(Netcyrax)向我介绍了开源社区。 他向我介绍了有关开放源代码及其运行方式的所有内容。 然后,他给了我一张Ubuntu CD,并告诉我Ubuntu正在通过发送免费副本来推广其操作系统。 第二天,我使用56k连接访问了www.ubuntu.com,并订购了50份Ubuntu。 我的意图是将它们出售给其他人,而不是免费提供。 那是15岁的我,我不了解开放源代码的目的。 无法理解目的 然后我开始编程。 我已经知道了开源,但实际上我不明白为什么我必须共享我的宝贵代码行。 为什么免费共享我花了几个月时间开发的程序源代码? 如果有人偷了怎么办? 如果我的“竞争对手”使用我的源代码来改进他们的产品怎么办? 当时我不明白的是,我不是一名杰出的软件开发人员,我的程序可以由经验丰富的软件开发人员在几天之内(而不是几个月)从头开始开发。 使用开源库很方便 是2008年,我有了第一部iPhone(3G)。 苹果宣布推出iOS 2和iOS SDK。 我决定(在业余时间)成为一名iOS开发人员。 由于还没有人使用过iOS SDK,因此我不得不自己学习开发应用程序。 我使用WebView创建了一个简单的应用程序,并且业务逻辑在使用JavaScript构建的Web应用程序内部。 我对iOS SDK感到非常失望(菜鸟开发人员+ Objective-C +手动引用计数=灾难),因此我暂停了本机iOS开发两年。 同时,我正在试验混合的SDK,例如Titanium,Adobe Air-ActionScript。 当我回到iOS 5(回到本机)时,一切都不同了。 在大约一个月的时间里,我设法构建了第一个真实的应用程序并将其上传到App Store。 但是发生了什么变化(自动引用计数除外)? 答 :iOS开发的开源社区。 ASIHTTPRequest(用于网络请求)和SDWebImage(用于下载和缓存图像)帮助我构建了第一个应用程序。 版本控制和GitHub 大多数开源项目和库都托管在Github上。 所以我当时使用Github下载我的库,但是由于我是在业余时间编程的,并且没有商业环境的经验,所以我不能说Git和Github之间的区别。 在构建了一些iOS应用之后,我对自己的技能充满信心,因此我决定申请iOS机会。 在第一次面试中的某个时刻: -访者:您使用什么版本控制? 我是什么意思版本控制? -访者:我的意思是您如何保留代码库的版本? SVN? 吉特? -Me:时间机器(OS X的备份软件)! 因此,在与访问者进行了交谈之后,我决定我想了解更多有关Git(以及一般而言的版本控制)的知识,并希望在自己的项目中使用它。 我阅读了很多有关Git的文章,以及如何在团队中使用它。 我学会了在BitBucket存储库中使用“提交”和“推送”。 我将其用作代码的备份和版本控制,但不用作协作工具。 […]

捕捉全部信息-从您的家中

《PokémonGo》在全球的Play商店和App Store上都大受欢迎。 尽管游戏在吸引人们行走以吸引越来越多的神奇宝贝方面做出了出色的努力,但有些人仍然更喜欢房屋的温暖。 因此,本文不是针对健身房怪胎(只是人们去锻炼的怪异健身房,而不是可以与其他神奇宝贝对抗的实际健身房),而是针对那些想要在不离开自己的美好房子的情况下捕捉所有神奇宝贝并孵化卵的人最好的是, 您不需要成为编码者 。 不幸的是,这仅包括对iPhone上的GPS进行欺骗,而对任何Android设备均无效。 开始吧。 在我们深入研究细节之前,您需要做一些欺骗iPhone GPS的事情: ·iPhone ·iPhone的电缆 · 苹果ID ·任何MacBook / iMac(在Windows或Linux计算机上均不起作用) ·Xcode(注意:如果使用的是iOS 9,则需要Xcode v7.3;如果使用的是iOS 10 Beta,则需要Xcode v8.0 Beta 2) 您需要做的第一件事是打开Xcode。 打开后,转到文件>新建>项目 屏幕将弹出,其中包含许多选项。 在左侧,选择iOS下的Application,在右侧,选择Single View Application,然后单击Next。 在下一页上,它将要求您提供一些详细信息。 您需要填写的字段是产品名称,组织名称,组织标识符。 (注意:“产品名称”以外的字段可能已经填写,因此请保留原样),然后单击“下一步”。 将会弹出另一个窗口,其中目录结构处于打开状态(保存文件时会打开该窗口)。 打开的路径始终是您所需的默认路径。 单击创建。 将打开一个新屏幕,其中包含许多内容。 不用担心 此时,您应该将iPhone与MacBook / iMac连接。 请记住,如果在连接之前设置了密码,则应该解锁iPhone。 连接后,在中间的顶部,您会看到一个选择的iPhone SE或其他型号。 单击它,然后在顶部,第一个选项应该是您的iPhone。 选择那个。 接下来,转到顶部栏。 转到产品>构建>运行。 现在给它一些时间进行编译,在iPhone上安装该应用程序并运行。 完成后,将在iPhone上打开一个空白的空白应用程序。 好了,现在您可以按下主页按钮,让应用程序在后台运行。 继续并打开您的PokémonGo应用程序。 加载后,您将看到。 (当然,根据您的位置,您的地图会有所不同。) […]

在Swift中学习编程-第166天

很抱歉在100天内从此处删除。 我本来不是打算确切地下车100天,但是我花了大约这么长时间才完成我留在Udacity iOS开发人员Nanodegree中的所有项目。 现在,我仍然有职业发展项目,以便毕业于我的Nanodegree Plus。 我希望在今年年底之前完成这些课程,但是我也一直有时间拿到我的Nano学位(除非Udacity提供扩展)。 无论如何,让我们退后一步,解释一下我最近100天学到的知识。 “在地图上”项目是有关学习如何与服务器端API通信以将数据获取到iOS设备的全部内容。 这非常困难,因为您必须进行身份验证(使用用户名/密码登录),然后将JSON中的数据“转换”为数组或字典。 最难的概念是此过程的异步性质。 您真的不知道服务器响应并向您提供数据所需的时间和时间。 您可能还会向服务器发送多个请求,并且很有可能会收到与发送请求顺序不符的响应,因此必须使用完成处理程序使它们保持顺序。 最重要的是,您必须在后台队列中执行所有这些操作,以便在等待服务器中的数据时不会冻结UI。 之后的项目是虚拟游客。 该项目以我在“在地图上”中学到的知识为基础,添加了“核心数据”,这是一种在iOS设备上存储数据库数据的方法。 这确实很棘手,当我决定切换到Swift 3时,我遇到了很多困难。因为Apple对Core Data进行了许多更改,所以我没有感觉到任何课程材料(在Swift 2.2中)就像我完全迷路了。 我在互联网上搜索了所有资源,以找到有关Swift 3中Core Data的完整教程,最后得到了Ray Wenderlich团队的Swift 3 Core Data书。 RW团队的教学方式是示例性的,因此很容易看到事情的运作方式。 不利的一面(去年我经历了一些iOS教程时就经历了这种方式)是,它们给出了太多的答案,当您从自己的想法中找出来时,您学到的东西不多拥有。 但是这本书当时对我来说是完美的,因为它阐明了苹果公司对Core Data所做的所有更改,并且我可以继续努力。 核心数据最难的概念是并发性。 当您有多个项目试图同时访问(写入或读取)Core Data中的数据库时,会发生这种情况? 如果安装不正确,则很可能会导致随机崩溃。 我对此还没有一个很好的概念,但是我知道每次使用Core Data时,都会添加额外的参数来调试并发问题,并尝试在上下文中执行每个Core Data任务。 如果您不使用Core Data,那么最后一部分可能没有多大意义,但是我不了解该主题,无法全面解释该主题(如果我用枪指着我的头,我可能会更好地解释它,但是我非常希望您阅读这篇文章)。 这样就使我进入了最终项目。 没有更多的学习。 这是关于使用我所学到的一切并将其自己整合到应用程序中。 好吧,没有更多的学习部分是不正确的。 实际上,我最终学到了很多东西,因为当我整理我的应用程序时,最终使用了很多课堂上没有教过的东西(NSFetchedResultsController,UISegmentedControl,UIStepper,UIPickerView)。 我可能会在另一篇文章中介绍我的应用程序,因为我真的应该继续从事我的Nanodegree的职业发展部分,因为这是我注册Nanodegree Plus时的一项要求。 在这一点上,我很高兴我即将结束这一旅程,我将再发表一篇文章,让大家知道我是否完成了我的纳米学位。 PS只是对Apple Watch自动解锁功能的更新,结果证明我使用的是WatchOS 3的Beta版,而自动解锁在Beta中无法正常使用。 我很高兴地说“自动解锁”现在可以正常工作,但充其量只能在大约75%到85%的时间内工作。 尽管我的手表还有另一个更新,但这与我所使用的Apple的标准相去甚远。 它可能会改善自动解锁的性能,但是长达一个小时的更新(我记得有些时候去年才长达4个小时)令人费解,这是Apple真正应该做的事情。

SpriteKit场景—使用didMove加载内容(以查看:SKView)

使用SpriteKit的iOS游戏中的所有内容内容都在SKScene类内。 SKScene是“场景图的根对象”,这意味着您可以近距离观察活动中的树木! 是的 我对SKScene和SKView之间的区别感到有些困惑,但是SKView只是UIView子类。 不太肉! 您可以完成我们的大多数属性分配,并在SKScene didMove(to: SKView)方法中didMove(to: SKView)编程方式进行设置。 以编程方式添加子级 这是最好的方法,因为所有内容都在代码中,但是可能要花很长时间。 如果设计师无法编写代码,您也将无法与他们轻松共享场景。 我喜欢Scene编辑器,因为它提供了很多复杂的选项,例如SpriteKit TileMap和动画,但它并不太复杂,您在编辑器中所做的任何事情都可以用代码完成。 请注意,在这种情况下,SKView不会调用场景编辑器文件,而是会调用GameViewController。

NC宣布出售-iOS上的Notification Center的Twitter小部件

NC宣布出售-iOS上的Notification Center的Twitter小部件 伦敦的Apps Genie Limited今天宣布了NC促销活动-通知中心的Twitter Widget。 该应用程序与iPhone,iPad和iPod touch设备兼容,为用户提供了增强的工具,可在锁定屏幕上或任何应用程序内部查看Twitter时间轴和提及内容。 使用NC,用户可以将此Twitter小部件添加到“通知中心”以随时查看Twitter提要。 在有限的时间内,只有应用程序购物者才能获得NC-通知中心的Twitter Widget,并且可以节省很多。 ******************************************** 英国伦敦-领先的移动解决方案和应用程序开发商Apps Genie Limited今天很高兴宣布推出NC促销活动-iOS通知中心的Twitter Widget,该应用程序的价格将在限定时间内从$ 6.99降至$ 0.99只要。 该应用程序专为在iPhone,iPad和iPod touch设备上使用而创建,为用户提供了增强的工具,可在锁定屏幕上或任何应用程序内查看Twitter时间轴和提及内容。 用户可以将NC Twitter小部件添加到“通知中心”以随时查看Twitter feed。 在有限的时间内,只有应用程序购物者才能获得NC-通知中心的Twitter Widget,并且可以节省很多。 北卡罗来纳州—用于通知的Twitter Widget当前可在Apple App Store上下载,折扣价仅为0.99美元。 超越其他Twitter通知解决方案NC提供了非常简单的集成。 下载应用程序后,您可以切换“今日标签”和“编辑”按钮,以从列表中选择NC。 此外,您还必须授予NC权限才能访问您的Twitter帐户。 应用程序提供2种浏览样式:时间轴和提及。 NC用户可以使用所有Twitter功能,因此他们可以直接从小部件轻松地在默认Twitter应用程序中收藏,转发或打开任何推文。 该应用程序专注于提供完善,全面和令人愉悦的Twitter通知体验,从而确保Twitter用户无论何时何地都可以随时获得指尖,随时可以快速访问其Twitter帐户。 当前在限定时间内仅以0.99美元的价格提供NC – Notification Center的Twitter Widget是管理Twitter的完美方法,因为该应用程序具有直观的设计,简单的设置过程和灵活的设置。 NC —通知中心的Twitter窗口小部件为Twitter通知设置了新标准,并将您的常规Twitter交互变成当今移动领域中最动态的解决方案之一。 Apps Genie Limited位于伦敦,是一家移动应用程序开发工作室,致力于为移动爱好者提供涵盖各种学科和重点的有价值且信息丰富的移动解决方案。 Apps Genie Limited一直致力于为移动受众提供结构合理且有效的应用程序。 (C)Apps Genie Limited2016。保留所有权利。 Apple,Apple徽标,iPhone,iPod和iPad是Apple Inc.在美国和/或其他国家的注册商标。 在App Store上下载NC-通知中心的Twitter窗口小部件,位于App […]

实现UIRefreshControl

前几天我在和朋友聊天,他提到了一些很有趣的事情。 他正在一个项目中,他们根本不使用任何开源代码(即,没有直接依赖项)。 这让我开始思考,如果我在相同的约束下运作,我的项目会是什么样子。 因此,当我最近被要求实施“按需刷新”功能时,我认为我可以在不咨询开源霸主的情况下试一试。 总览 实现可刷新的样式刷新控件,该控件可以附加到UITableView上,而不会泄漏太多实现细节。 需要使用可响应状态更改的文本和图像进行自定义。 源代码可以在这里找到。 由于很快就把它放在一起,所以还没有经过充分的测试,但是似乎可以正常工作。 如果您有任何改进方法,请告诉我。 第一站,UIRefreshControl 我在这里写了很长的篇幅谈论股票更新控制,但是我看到了它们的利弊时选择了: +易于使用,可直接放入解决方案 –难以定制 –非全萤幕检视画面上的视觉错误,例如跳动的动画 如果您对股票动画没问题,正在使用全尺寸的表格视图以及使用UITableViewController,那么这将是一个完美的控件。 不幸的是,这些都不适用于我试图做的事情。 在使用UIRefreshControl进行了一些修改之后,我放弃了自己的程序并推出了自己的程序。 我真正喜欢的是Apple的刷新控制界面。 它们仅公开一个动作(UIControlEventValueDidChange)和一组方法(beginRefreshing和endRefreshing)。 这使得管理表视图编码时如何与控件交互以及将所有实现精巧地保留在刷新控件本身中变得非常容易。 因此,我从他们的设计中得到了启发,以启发我自己的版本。 但是在我们开始之前 UIRefreshControl如何工作? UIRefreshControl的核心极其简单,但与其他所有细节一样,魔鬼也是如此。 我无法确切地说出苹果实施的工作原理,但我必须想象流程如下。 要记住的关键是我们将使用tableView子类的scrollView —因此,当我在下面引用tableView时,它实际上是其scrollView超类的属性。 观察tableView内容的偏移量 当contentOffset.y> pullDistance时,触发刷新 调整tableView contentInset和contentOffset以解决以下状态: 默认值(用户完全没有与tableview进行交互) 拉(用户已拖动表格视图,并且控件尚未完全显示) 拉动(用户已拉动表格视图,并且控件已完全显示,但尚未达到刷新距离) 拉动和刷新(用户已拉出足够的距离以达到刷新距离) 已发布(用户在刷新距离之前已释放表) 已发布(用户在刷新距离后已释放表) 我们实际上并不会专门针对所有这些状态进行编程,但是最好记住控件将负责处理哪些状态,并为我们提供如何对这些状态做出反应的良好框架。 另一个有趣的地方是来自Apple的文档:“拥有刷新控件的UITableViewController对象还负责设置该控件的框架矩形。 因此,您不需要直接在视图层次结构中管理刷新控件的大小或位置。”因此,我们将尝试做同样的事情,并使它对于最终视图控制器尽可能地无缝。 自定义刷新控件 设置此控件将是了解滚动视图的contentOffset和contentInset如何工作的问题,然后如上所述适当地调整为不同的状态。 让我们遍历每种状态并了解视图的外观,以便我们对需要做的事情有很好的了解。 内容偏移 苹果将​​其描述为“内容视图的原点与滚动视图的原点之间的偏移量”,这实际上是很有意义的。 contentOffset只是任何滚动视图上的一个属性,它是一个精确描述了此CGPoint的属性。 contentOffset可以告诉我们用户将滚动视图从其原始位置拖动(或偏移)了多远。 该点将从(0,0)开始,并在您向下拖动滚动视图时,偏移量将开始增大(0,-1),(0,-2)。一直到用户拖动的程度。 回想一下,负数表示用户在视图上向下拖动。 因此,这样做的目的是提供一种简单的方法来查看滚动视图被拖动到多远,并且一旦有了,我们就可以通过执行类似这样的操作来响应contentOffset.y。 我们使pullDistance保持正值,以便以后使用时更容易。 -(void)scrollViewDidScroll:(UIScrollView *)scrollView […]

滑动过渡和快速浏览– Christian Tietze –中

(在https://christiantietze.de/posts/2017/01/reswift-swipe-transitions/中阅读格式正确的故事) 在昨天的一次客户会议上,我们尝试找出当ReSwift是应用程序状态的唯一真实来源时,如何通过向左/向右滑动来为场景过渡设置动画。 应用进入什么状态? 您如何制作动画? 出于某种原因,转换百分比是否应该成为应用程序状态的一部分? (剧透:没有) 滑动首先具有挑战性,因为从视图控制器A到B的这种交互式过渡需要同时显示两者:滑动时,需要在视觉上“拖动” B。 添加自定义导航控件时,最终会得到一个主视图控制器,该控制器包含一个子视图控制器以显示实际的表视图(下图中的绿色框)。 这些表格视图应从左侧或右侧刷入并触发导航更改。 在此示例中,用户看到给定日期的数据。 她应该使用滑动和导航按钮自由导航到前一天和后一天,直到时间的开始或结束。 (或我们的数据限制,以先到者为准。) 让我们分析一下实现这一点。 单状态替换,无过渡 在没有过渡的静态世界中,只有导航栏的“上一个”和“下一个”按钮(以蓝色表示)会触发导航更改:您点击该按钮,请求来自服务器的新数据,也许您会显示一个加载指示器,然后替换UITableDataSource的内容。 现在,如果您使用ReSwift,则当前可见的数据集合将成为您应用状态的一部分。 保持简单,表格视图的单元格将显示文本。 状态看起来像这样: struct AppState:ReSwift.StateType { var内容:[String] } 想象一下,您有一些动作,减速器以及对导航更改做出的适当反应。 (这本身可能是一个挑战,并且可能是另一天的话题。提示:您将需要“更改日”操作来触发网络请求,并需要“替换数据”操作来更新内容。) 为了显示最新状态更改,您设置了一个Presenter,它是ReSwift.StoreSubscriber。 当您从服务器接收数据并替换AppState.contents时,将调用newState回调。 然后,此字符串数组将传递到用户界面进行显示。 我们将该方法称为updateView(linesOfText :)。 这是一个体系结构上的注释: updateView(linesOfText 🙂方法,我想要演示的调用者应该由主视图控制器公开。 反过来,这可以委派给其当前的子视图控制器,该控制器处理表的实际显示。 但是,从长远来看,将表示者(表示层(!)外部的服务对象)耦合到子视图控制器可能会对您造成伤害。 主视图控制器是整个组件的外壳,因此它负责公开可用的接口。 内部组件的数量和对其的委派是其他对象不关心的实现细节。 (您一会儿就会明白为什么。) 此设置非常简单。 AppState更改通过Presenter的流程,该Presenter会在必要时创建视图模型,然后将其传递到其视图组件。 结果,UITableView重新加载了新数据,您就完成了。 那是最准方法。 在添加交互式过渡之前,让我们首先使其具有更高的响应速度。 现在,每次点击按钮都会触发一个网络请求,该请求使用户的交互停止。 “走走走走”导航在孩子们中并不普遍,因此我们将在下一步中预取隔天的数据。 预取相邻天的数据 在表示层中,我想象情况会有所变化,如下所示: 从上面对简单方法的更改是: 主视图控制器具有3个子视图控制器,而不是1个。所有子视图控制器均已准备就绪,可以显示。 轻按按钮现在有两件事:像以前一样触发“更改日”导航操作, 并立即将正确的子视图控制器放在顶部。 为了使所有这些成为可能,Presenter组装了一个具有3个内容数组而不是1的ViewModel。 视图模型仍然非常简单: struct […]