Tag: 开发

充满材料设计的天空

关于Google及其给iOS UI开发人员的礼物。 我知道。 我是一名Android开发人员,应该与这个小机器人呆在一起。 但是,即使它在iOS中实现,我也无法抗拒Material Design! 几天前,我正在为我目前的公司开发一个应用程序。 我做了一个“ meh”布局(我不专门从事iOS布局,但是工作是工作,我必须安排这样做)。 看到糟糕的设计-好吧,它并没有那么糟糕,只是没有那么有趣-看着漂亮的Android对应产品,我脑海里浮现出一个疑问:“材质设计呢?”。 不久前,我尝试了一个由CosmicMind的iOS第三方库,其中包含许多MD控件(请在此处进行检查),但真诚地,它并没有说服我。 我不知道为什么,对我来说,它太“塑性”了,无法使用……也许对您来说它运行良好,所以尝试一下,也许您找到了梦想中的图书馆! 因此,我在网络上搜索了有关Big G设计范例的另一个库,然后我进入了一个GitHub存储库,这使我大为震惊:iOS的Material Components。 只有一堆星星(目前大约有六百个星星,考虑到GitHub上有许多10–20k★s项目,这并不是一个很大的数字!),但是我开始阅读其中的描述。 “由Google的工程师和UX设计师的核心团队开发。”好的,我已经在做梦了:Google员工为Material Design设计的iOS库? 我也可以用我喜爱的图形样式开发Apple产品吗? 我必须学习和使用它! 好吧,故事的结尾让我开心,就像一个婴儿用我的公司iPad跑步(嘘,别对老板说,我很好地对待这些东西🙄),向我的同事们展示了奇迹,以及一个令人惊叹且非常流畅的应用程序。 今天,我只想向您展示如何使用这个漂亮的库:我们将构建一个小的Material Design Twitter客户端(“ Pff,另外一个?!网络上有很多关于蓝鸟客户端的教程!” —是的。程序员没有想象力,我发现已经完成的Swifter Twitter-API-swift时期。 在GitHub上可以找到我写的,我在本文中谈论的Twitter客户端。

图片如何使我们的APP崩溃

最近,我们的团队遇到了一个特例,这使我们发疯。 在我们发布新版本的应用程序之前,一切看起来都很不错。 但是在接下来的几个小时里,我发现我不断收到很多警告信,似乎出了点坏事……哦! 没有! 它们每个都是崩溃报告,并迫使我们进入“值班”模式。 这是细节… 在调查开始时,我们首先检查崩溃报告中的每个不同的调用堆栈线程。 它们都不容易解决,看起来每次崩溃都发生在代码的不同部分。 但是,它们具有与“ 自动布局”和“ 图像”相关的一些共同特征。 我们将继续检查这些报告,并找到另一个线索:这些用户正在使用iOS 9.2 ! 我认为这不是一个随机的崩溃案例。 我们改变了方式,并开始通过互联网发现相关问题。 我使用以下关键字搜索: iOS9.2, crash, FBSSerialQueue ,并在下面的链接中讨论了有关通过App Store和TestFlight发布后崩溃的信息。 它还引起我们的注意,只有通过App Store下载应用程序时才会发生此问题。 应用程序在启动时立即崩溃。.仅通过TestFlight或Store发行时在iOS9中崩溃… 我有一个iPhone应用程序,仅在通过TestFlight或App Store发布后才在iOS9设备上崩溃。 stackoverflow.com “错误ITMS-90682:无效的捆绑软件-如果应用程序支持iOS 8或更早版本,则’Payload / XXXXX / Assets.car’上的资产目录不能包含16位或P3资产。”之前。 但是,将应用程序提交到iTunes Connect时,我们没有看到此错误。 详细信息是Apple允许开发人员在iOS 9.3版本之后使用具有16位或P3资产的扩展RGB颜色作为图像格式。 但是那些低于iOS 9.3版本的应用将导致无法预料的错误。 目前,我们知道应用程序中会发生什么。 我们重新检查代码中的每一行, 那些与AutoLayout相关的代码正在调整图像位置。 因此问题暴露了,使用iOS 9.0到9.2的用户将在打开我们的产品后立即崩溃。 我们必须调查以下两种不同的途径: 如何解决此问题? 以及如何防止它再次发生? 第一个问题很容易解决,后一个问题需要一些技巧。 我们可以回到链接并找到另一个讨论线程: ITMS-90682:不能包含16位或P3资产…| | 苹果开发者论坛 嗨,我刚刚开始在testflight提交中看到此错误(资产没有更改)(我们有仅限iOS10的代码)… forums.developer.apple.com […]

在Swift 4中使用Segue

您在这里或更准确地说,是我写这篇文章的事实,向我们展示了我们过去如何视这些小事情为理所当然。 谁知道按下按钮并使iPhone进入下一个屏幕将在引擎盖后面做很多工作🙂 自从我开始开发iOS应用程序以来,手机上的每个应用程序都令我感到惊讶……也许是,这种惊奇促使我了解更多信息。 “他们到底是怎么做到的?”“太酷了!。我想知道我是否能够做到这一点..” 诸如此类的好奇心和问题是学习任何事物的动力之一。 如果您对某些东西感兴趣,那么您对它不了解的东西就会消失……只是为了让您有机会了解它。 这个序言已经足够了,让我们来谈谈您来到这里的事情… 从一个ViewController(屏幕)到另一个ViewController,执行简单的“ Segue”移动需要遵循哪些步骤。 步骤1:按住Control键并从“按钮”拖动到所需的VC,然后松开。 现在,根据您的要求选择“显示”或“显示详细信息”选项。 第2步:点击Segue箭头,并为其“标识符”命名 步骤3:将您用于创建序列的按钮链接为IBAction。 步骤4:在该IBAction中,编写以下代码: 选项1:如果您不想发送任何数据,那么下面的行就足够了。 performSegue(withIdentifier:“ goToNextViewController”,发送者:self) “ goToNextViewController”与我们为segue命名的名称相同,还记得吗? 选项2:如果您确实想在ViewController之间传递数据,则在此IBAction方法的下方(和外部),编写以下代码行: 覆盖func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 让destinationVC = segue.destination作为! SecondViewController destinationVC。 →您可以在这里访问另一个VC中的变量/属性…,这就是开始在两个VC之间传递数据的方式。 } 这就是现在的人们, 希望这可以帮助, 温暖的问候, Hiten…

iOS 12:Apple Presenta la nuevaversiónde su sistema操作

2018年6月4日,ApplePresentóWWDC lasúltimasnovedades para desarrolladores,entre sus nuevos productos tenemos iOS 12。 在iOS 11上使用操作系统时,通常会遇到一些问题,特别是在iOS 11上可能会出现问题,特别是在某些情况下,应该以反义词为准。 Desde el punto de vista de dessarrollo de软件,tanto Xcode como Swift han sido Actualizados,El nuevo compilador estodavíamás有效的y el nuevo SDK garantiza un renderizadomúsfluíplilas vistas de nuestras。 决赛获得最佳球员奖,埃塞俄比亚足协冠军和最佳球员奖得主。 最新消息 最终客户可以在不负责任的情况下获得一份新的书面通知,从新客户那里获得一份可兑换的原始报酬,您可以从最终客户那里获得一笔交易。 从iOS到tremodamente alto的日常使用,以及从iOS 11到11%的存储库的实际使用情况。 La tentencia se viene repitiendo cadaañoy,dadas las Expectativas,esteañovamos a estar […]

可视化扩展布局

我注意到许多在线用户(即StackOverflow)在视图布局不正确时会跳到少数UIViewController属性,然后几乎随机地操作它们以获得所需的行为。 这总是导致对布局问题的“可接受”答案是“自动将AdjutstsScrollViewInsets设置为[true / false]”或“将edgesForExtendedLayout设置为UIRectEdgeZero”,其中一个人说“谢谢,已修复!”,另外五个人说“那没错”。修复它会有所帮助”。 即使在Apple的WWDC视频中,也没有关于这些API的工作原理以及它们相互之间有什么影响的超级清晰的解释,尽管WWDC 2013在发布时有广泛的概述。 我找不到关于其所有工作原理的出色文章,所以我想针对这些API的工作原理发布PSA,以便我们可以开始以正确的方式修复问题并停止永久保存不良信息。 我认为具有交互属性的示例应用程序绝对是了解UIKit来龙去脉的最佳方法。 如果你玩的够多的话,你就可以开始预测行为。 一旦您可以解释更改给定属性将对结果布局产生什么影响,便有了相当不错的掌握。 因此,为了说明这一切是如何工作的,我将包括一个示例应用程序的屏幕截图,然后为您提供一个停顿的地方,并思考改变给定属性的效果。 当然,您可以浏览一下,但是我想您会发现尝试提前计算出最终的布局会更有优势。 为此,我们将从iOS 10开始,它使我们可以忽略新引入的safeArea及其带来的其他API(和注意事项)的影响。 我们将在不久的将来覆盖这些内容。 这是所有具有实例化时视图/视图控制器具有的默认值以及在UINavigationController内部显示tableView时的默认外观的所有内容。 请注意,tableView的背景为绿色,但单元格背景为红色。 我们可以使用它来查看tableView的开始位置及其内容的开始位置; 当这两个不同时,我们正在查看一个非零contentInset,它显示在底部的单元格中。 这个contentInset来自哪里? 如果您检查代码,我们不会自己指定。 自动输入AdjustsScrollViewInsets 。 UIViewController属性autoAdjustsScrollViewInsets是iOS 7(对界面进行了大修的版本)中引入的,默认为true。 在iOS 7中,导航栏默认为半透明,并且为了展示半透明性,视图必须在导航栏下方开始(如果没有内容可看,您将无法欣赏半透明!)。 但是,如果视图从导航栏后面开始,则很明显,如果没有一些Apple Magic™来为开发人员处理事情,事情就会变得模糊。 这种魔术以automaticAdjustsScrollViewInsets的形式出现,它进入UIViewController的子视图并运行此测试: func magicView()-> UIView? { 保护self.isKind(of:UIScrollView.self)else { 返回self.subviews.first?.shouldApplyMagic() } 返回自我 } 并自动设置该滚动视图的contentInset以容纳navigationBar。 ContentInsets是非常基本的,我仅将这一部分包括在内,以快速提醒那些尚不清楚的人。 我发现,如果您将UIScrollViews视为内容的“窗口”,则更容易理解它们在做什么; 窗口框架本身不会改变大小,但是您可以四处走动以查看窗口框架后面的其他内容。 您所看到的不止是那里,所以一旦您触及内容的最上/最下部分,就无法再进行任何操作(忽略弹跳的UIKit给我们提供的内容)。 使用相同的隐喻,contentInset本质上将“空白”内容添加到您正在查看的内容上方,这意味着您可以看到比其他地方更多的内容。 如果我将topContentInset添加为100点,则意味着我可以滚动到内容的顶部,然后再在其上方滚动100点。 对于UITableView的基本情况,这只是空白,它将显示您的backgroundColor是什么,但是UIScrollViews可以让您做更多的事情。 我现在不会讲这个; 也许解释UIScrollViews是另一天的好主意。 既然我们对automaticAdjustsScrollViewInsets有了一个不错的了解,那么应用程序的初始状态就应该有意义。 我们的视图从UINavigationController的顶部开始(当然,它的视图)。 默认情况下,Apple会自动为我们提供AdjustsScrollViewInsets == true,因此,在布局视图时,它会看到导航栏的高度为64(进入状态栏区域),并在tableView上方为我们提供了64个空白内容。 […]

迅捷金属乐

适用于iOS和macOS的超快速着色器和管线探索 在过去的几年中,与许多开发人员一样,在Swift Playgrounds中工作时,我对编辑/编译/运行周期的速度不满意。 Swift Playgrounds让我们有机会轻松编写快速代码以测试概念,而无需构建完整的应用程序,部署到设备或模拟器以及观察结果。 我已使用Swift Playgrounds更好地了解了许多技术,包括: 斯威夫特语言概念 核心动画 SpriteKit 场景套件 一个让我难以理解的领域是在Swift Playground的Metal中工作。 Metal是Apple的底层图形系统,旨在利用自己的硬件并提供出色的性能。 我相当怀疑是否有直接在Metal中工作的实际输出-SceneKit对我来说做得很好-但我仍然感到需要挠痒痒。 因此,另一个游乐场冒险开始了。 配置游乐场 在创建用于Metal开发的游乐场时,需要将其设置为macOS游乐场。 iOS操场不符合条件,因为模拟器无法提供我们进行Metal开发所需的直接GPU访问。 我们需要导入一些框架。 为了处理我们的macOS视图,我们需要访问Cocoa。 我们需要Metal才能与Metal合作。 最后,我们需要PlaygroundSupport才能显示Metal视图。

在Swift中撤消历史记录

利用价值语义实现大善 在过去的几周中,有许多博客文章希望向Swift添加动态行为。 Swift已经是一种非常动态的语言:它具有泛型,协议,一等函数,并且标准库中填充了诸如map和filter之类的函数,这些函数动态地获取其操作(不是像KVC那样使用字符串,而是使用函数,这样更安全,更灵活)。 大多数说想要动态行为的人意味着他们特别想反思:他们想在运行时分析和修改程序。 在Swift中,只有非常有限的反射机制,尽管您已经可以在运行时检查并生成代码。 例如,以下是生成可用于NSCoding或JSON序列化的字典的方法:Swift镜像和JSON。 今天,我们将看看在Swift中实现撤消功能。 人们不断提出来进行反思(Objective-C支持)的示例之一是NSUndoManager。 借助struct语义,我们可以以其他方式向应用程序添加撤消支持。 在开始之前,请确保您了解结构在Swift中的工作方式(最重要的是,它们都是唯一的副本)。 显然,本文不会消除在Swift中进行运行时编程的需要,也不会替代NSUndoManager。 这只是一个如何思考的简单例子。 我们将构建一个名为UndoHistory的结构。 需要注意的是,它仅在A为结构体时才有效。 为了保留所有状态的历史记录,我们可以将每个值存储在数组中。 每当我们要更改某些内容时,我们都将其推入阵列,而每当要撤消操作时,便会从阵列中弹出。 我们总是想从初始状态开始,因此我们为此创建一个初始化器: struct UndoHistory { private let initialValue:A 私人var历史记录:[A] = [] init(initialValue:A){ self.initialValue =初始值 } } 例如,如果要向由数组支持的表视图控制器添加撤消支持,则可以创建此结构的值: var history = UndoHistory(initialValue:[1、2、3]) 为了支持对其他结构的撤消操作,我们从一个不同的初始值开始: struct Person { 变量名称:字符串 变量年龄:整数 } var personH​​istory = UndoHistory(initialValue:Person(名称:“ Chris”,年龄:31)) 当然,我们希望有一种获取当前状态并设置当前状态的方法(换句话说:将一个项目添加到我们的历史记录中)。 要获取当前状态,我们只需返回历史记录数组中的最后一项,如果数组为空,则返回初始值。 要设置当前状态,我们只需追加到历史记录数组即可。 扩展名UndoHistory { var currentItem:A […]

在移动文本冒险中为OOC事件创建框架

编码开始:Systers的GSoC 我已经开始上一堂课,为我们的游戏PowerUp处理故事序列。 我认为它更多的是设计挑战,而不是编码挑战。 我想确保它易于使用,并且对其余应用程序功能的影响最小。 我希望其他人认为“嘿,还不错。 我可以为此创建内容并添加它。” 所以这是清单: 应该可以将其添加到应用程序中任何位置的视图层次结构中,并且这样做应该尽可能简单。 序列应可自定义,但数据模型应易于阅读和设计。 繁重的工作将由班级本身来完成。 另一个开发人员不需要三页的Wiki即可实现序列。 这没什么大不了的,但是需要正确地做。 我绝对不喜欢复杂的代码模式,这些模式会使很酷的工具体积庞大且无法使用。 1为了使它易于使用并立即被其他iOS开发人员所熟悉, StorySequencePlayer是UIView的子类。 即使类是控制器,也不必是UIViewController。 该计划是通过将视图呈现为叠加层并在完成呈现内容后使用委托来处理解雇来简化其生命周期。 在外部,唯一添加到现有视图控制器的代码应该看起来很熟悉: //获取模型,初始化并添加到视图 func startSequence(){ 警卫队让模型= getTheModel()其他{返回} let view = StorySequencePlayer(代表:自我,模型:模型) self.view.addSubview(view) } //取消最后一步时调用此委托方法 func sequenceDidFinish(发送者:StorySequencePlayer){ sender.removeFromSuperview() }

我的第一个Swift应用程序– Ricardo Hurla –中

我的第一个Swift App –简介 我叫Ricardo Hurla ,自2013年以来我一直在为iOS开发,在很棒的地方工作,有很多人,并且从他们那里学到了很多东西。 我在巴西出生和长大,但是从 今年(2016年),我搬到北爱尔兰贝尔法斯特,在那里我担任iOS开发人员。 由于这对我来说是一种全新的体验(包括撰写文章和使用Swift进行编程),我决定在这里分享,也许 帮助想要开始使用该语言或仅显示简单应用程序创建步骤的人。 我决定使用Swift重新创建名为BuZu的应用。 第一个版本在AppStore上,用Objective-C编写。 它是巴西圣保罗的公交车跟踪应用程序,它使用SPTrans的开放式API来获取“实时”数据。 因此,从现在开始,我将继续使用此应用程序,在这里,我将首次分享与Swift合作的经验。 我将从创建iOS应用程序结构到将应用程序发布到AppStore,通过应用程序设计,图标设计,应用程序商店流程等等。 让我开始描述我在该项目上使用的工具。 草绘和Photoshop的应用程序和图标设计。 http://www.sketchapp.com/ 用于项目开发的Xcode 。 https://developer.apple.com/xcode/download/ Github用于存储库。 https://github.com/ 终端和oh-my-zsh进行git控制。 https://github.com/robbyrussell/oh-my-zsh CocoaPods管理依赖项。 https://cocoapods.org/ SwiftyJSON解析从API接收的结果。 https://github.com/SwiftyJSON/SwiftyJSON SPTrans API检索数据。 http://www.sptrans.com.br/desenvolvedores/ 我已经在SPTrans网站上注册了自己,并从他们那里获取了应用程序令牌,消费者密钥和消费者秘密。 我将不在此项目上使用测试和UI测试。 就是这个帖子! 很快,我将以第一步发布启动项目。 非常感谢!

询问专家:一劳永逸地揭穿iPhone应用开发的7个神话

这是2018年iOS应用程序开发的现实情况: 有很多假新闻。 在开发和设计iOS应用程序时,似乎每个角落都有一个崭新的神话。 无论您是阅读博客文章,观看视频,还是只是滚动浏览Facebook提要,您都必定会至少怀有一种陈词滥调的信念,即如何构建iPhone应用程序。 也许这是您用来构建它的语言。 也许这是您应该或不 应该使用的Apple工具。 也许这是您通常必须进行应用程序构建过程的方式。 底线是:我们正处于数字时代,无论您到哪里都可以找到关于应用程序开发过程的神话。 这给我们提出了一个非常重要的问题…… 我们向一些才华横溢的iOS专家提出了这个问题,以获取有关iPhone应用程序的BS知识,并征询他们在构建iOS应用程序时应真正关注的方面的建议。 根据我们的专家的说法,以下是有关构建iOS应用程序的7个最大误解,以及在创建自己的应用程序时可以依靠的主要知识: 当我们要求Unsplash的本机应用程序构建者Olivier Collet列举最大的iOS应用程序开发神话时,他说: “我认为许多开发人员低估了Apple提供的工具和框架,浪费了太多时间来思考应用程序体系结构和新概念。 我看到了太多过度设计的应用程序,并且阅读了太多文章,这些文章带来的复杂性比简单性还要大。” 这是关键要点: 您不需要重新发明轮子。 在构建iOS应用时,不要害怕使用Apple提供的框架。 它们是由经验丰富的iOS开发人员创建和微调的,它们对有效的方法和无效的方法有大量的了解。 iPhone应用程序开发人员经常将苹果的框架标记为过于简单,而是尝试从头开始构建某些框架。 典型的结果是,一个应用程序的构建时间要长得多,并且比实际需要的复杂得多。 拥抱简单。 阅读:了解移动应用程序用户体验设计的终极指南 这是汗学院的早期产品开发负责人安迪·马图沙克(Andy Matuschak)所说的最著名的应用程序构建神话: “关于应用程序的最重要的神话是,应用程序创建过程中重要的,具有挑战性的部分是技术。 它在上下文中了解真实的人类需求,并追踪这些需求与技术可能会促进的重叠。 编程是容易的部分。” 对于有经验的开发人员而言,编写代码和对应用程序本身进行编程不太可能成为主要挑战。 真正的挑战是: 您需要了解用户的需求,以及如何提供与他们的需求相匹配的应用程序体验。 在开始构建iPhone应用程序时,用户必须排在第一位。 问问自己您要解决的问题是什么,什么会促使某人下载您的应用程序,以及如何确保自己构建的东西是人们会感兴趣的东西。 objc.io的联合创始人兼作家Chris Eidhof告诉我们: “我们刚刚写完了App Architecture一书。 我编写该书的最大收获就是,只要您了解局限性,就可以在任何体系结构(也包括MVC)中编写简洁的代码。” 人们普遍认为,您只能使用某些类型的应用程序体系结构来创建某些类型的iOS应用程序,并且尝试使用其他体系结构来构建应用程序会导致代码混乱和糟糕的用户体验。 事实是,只要您知道它的局限性,就可以使用任何体系结构构建一个干净的iPhone应用程序。 在深入研究适用于iOS应用程序的其他应用程序体系结构之前,请先研究该体系结构的局限性,以确保代码始终干净。 如果您事先不知道局限性,则可能会发现自己在回溯工作以修补并修复过去的工作,从而造成不必要的麻烦和不理想的用户体验。 我们已经揭开了开发人员必须在Apple框架之外思考的神话。 但是,根据Artsy的设计师兼工程师Orta Therox所说,太多的开发人员只在盒子里思考: “大多数人只是假设苹果在制作应用程序时最了解,并选择始终复制苹果的策略并在自己的约束范围内生存。 考虑到构建应用程序的问题,这并非总是正确的方法-因为Apple与您的需求截然不同。” 不要害怕拥抱您的内在创意,并将Apple先前存在的框架提升到新的高度。 尽管Apple的框架是一个很好的起点,但您的iPhone应用程序(希望)正在解决一个独特的问题,无论谁构建Apple的框架都可能没有考虑过。 无论苹果提供了什么框架,都可以利用您对上述问题的专业知识,构建最适合提供解决方案的iOS应用。 当我们向PSPDFKit的创始人兼首席执行官Peter Steinberger询问他对应用程序开发神话的看法时,他简短而贴切: “您需要使用Swift才能拥有成功的应用程序。” Swift是Apple创建的一种编程语言,用于在所有iOS设备上构建iOS应用程序。 […]