Tag: iOS应用开发

iOS UI实施方法如何帮助我们获得简洁的代码。

“当我们使用容器视图时,视图控制器的层次结构” iOS UI实施如何帮助我们获得简洁的代码。 考虑XCode项目中的容器控件,即使没有任何专业知识,也可以帮助您减少代码中的行数。

带Lottie的iOS动画

几个月前,当我在团队中使用一项新功能时,我们被要求为iOS App添加某种动画,以区别于其他动画,尤其需要“神奇”的东西。 在github上进行了快速研究之后,我们发现了一个“神奇的”框架,可以实现我们的目标,该框架是Lottie。 Lottie是由Airbnb开发人员针对Android和iOS创建的一个库,用于解析使用bodymovin以JSON格式导出的Adobe After Effects动画,并在移动设备和彻底的React Native上本地渲染矢量动画。 这意味着,使用Lottie,您可以简单地从设计团队获取动画文件,将其作为JSON导出,然后将其放入您的应用程序中,这将与它们在后期效果环境中的外观一样好。 从我个人的角度来看,优点还在于,您可以节省大量时间来尝试通过其他方式(例如通过代码实现修改图层或形状)来执行动画,由于JSON文件的尺寸较小,您将节省大量空间并且您的应用将变得超轻量级,或者,如果您愿意,也可以远程存储JSON文件,然后按需下载它们。 因此,如果您想要提供以下功能: 高质量动画,小文件大小(或远程存储),快速实施和易于集成 乐天是解决方案。 所有这些事情都是可能的,并且通过这篇文章您将学习如何做💪😎。 Xcode Github帐户 迦太基/ CocoaPods [基本知识] 创意[选择动画文件😅] 让我们从创建一个简单的iOS App开始,只需打开Xcode-> File-> New-> Project-> Single View App 让我们为项目指定一个名称,并将Language设置为Swift 要安装Lottie,我们有两个选择(两个都可以使用) 可可豆 迦太基 我本打算使用迦太基作为这篇文章,因为我想在迦太基上练习更多的技能,但我只是意识到已经有一段时间了,因为我不使用Cocoapods,所以..让我们两个都做吧..决定哪个可以满足您的要求。 1:关闭您的XCode项目 2:转到存储项目的文件夹 3:创建一个PodFile 4:将Lottie Pod添加到PodFile: pod ‘lottie-ios’ 5:运行: pod install 1:关闭您的XCode项目 2:转到存储项目的文件夹 3:创建一个Cartfile 4:运行carthage update 5:在应用程序目标的“ 常规设置”选项卡上的“ 嵌入式二进制文件”部分中,将要使用的每个框架从磁盘上的Carthage / Build文件夹中拖放。 现在我们已经准备好环境,可以开始在动画中工作了。 我们打开项目并在情节提要中添加一个Container UIView,如果您希望为该视图设置Constraints […]

如何在IOS App中监视网络请求

在这篇文章中,让我们看看如何在IOS swift应用程序中监视和调试网络请求。 在此演示中,使用了Swift 4.1。 让我们从创建一个新的IOS swift项目开始。 现在,打开Storyboard并创建一个新按钮,然后通过创建一个动作函数将其连接到ViewController。 现在,我们创建一个名为requestData()的方法,在其中编写所有网络代码。 让我们使用session.dataTask() 现在让我们创建一个URL。 转到Intercept.rest并创建一个新的Intercept帐户。 通过提供端点URL作为所需的API URL来创建新的拦截器,然后单击“ 创建”按钮。 现在,复制已生成的新URL 。 现在打开代码,并将新生成的URL粘贴为常量URL的值,然后运行该应用程序。 按下我们创建的按钮,同时检查拦截器仪表板。 现在,您可以监视所有网络请求。 按下“扩展”按钮以查看完整的JSON响应。 Intercept.rest使您可以调试和监视API请求和响应。 它类似于Chrome开发者工具中的“网络”标签,但适用于任何API:移动应用,网络挂钩,前端等。

带有固定页脚UIButton的TableView中的多个单元格类型

带有固定页脚UIButton的TableView中的多个单元格类型 此案例终于实作成功啰!为了感谢社群的温暖力量,我分享我自己实作后遇到的困难点,希望也能帮助其他跟我一样遇到困难的朋友们。 画面需求: 1.有五种搜寻items的方式,两个栏位是透过api回传可选的选项,两个栏位是跳出日期选择,一种栏位是输入编号,共有五种(分四个部分)。 2.使用者点击文本字段之后,会跳出pickerView压在tableView上面 3.有一个修复页脚按钮作用是送出筛选条件的提交按钮 根据图片所示的需求,我苦恼很久,在通过各位好心的大大给的各种建议,我决定先采用tableView搭配类似的单元格类型去实作里面的内容。虽然有其他大大推荐的滚动视图,也是很不错的方案,但我暂时无法自己应付自动布局,会花比较多的时间。tableView的好处是可以帮我处理自动布局。 困难1。 在实作的过程中,遇到比较难的问题在于,我要的是触发里面的文本字段,而不是触发cell,所以我必须要禁用(取消)cell的触发事件功能,然后使用addTarget这个方法去触发功能,再透过功能的发件人获得我为文本字段设置的标签编号去攫取文本字段的值。 注意:可是我还是无法达到不要让textfield可以输入字,但依然触发tag event 演示: func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { switch indexPath.section { case 0: let cell = tableView.dequeueReusableCell(withIdentifier: “dateCell”)! as! SearchByDateCell cell.dataTest.tag = 11 cell.dataTest.addTarget(self, action: #selector(OrderViewController.selectAction), for: UIControlEvents.editingDidBegin) Return cell default: // code here return cell } } 困难2。 选择器视图与表视图的实作函数在同一个视图控制器类中,感觉非常杂,只好使用备注,和排放整齐来让程序码更易读。另外的选择器视图要压在表视图这个地方不是穿透IB或纯代码一开始实作很不适应,因为不了解UIView之前的层次优先问题,导致选择器视图一直出不来。以下是成功的实际选择器视图压在表视图的功能代码 func […]

运行iOS版本-第3部分,React Native DevOps指南

TLDR: 为三种构建类型配置一个React Native iOS项目:开发,登台和发布。 自定义构建行为以实现Xcode的可重复性,然后使用Fastlane简化流程。 使用Jenkins自动化Fastlane构建流程。 简介| 设置| 预建| iOS | Android | 詹金斯| CodePush | 测试中 概要 概念— Xcode 构建类型和目的地 按键和配置文件 管理Xcode 构型 方案 构建设置 建立阶段 新建系统 概念— Fastlane 车道 选件 元数据/ App Store 詹金斯 演练 创建登台配置 创建开发,暂存和发布方案 编辑构建选项和阶段 查看签名配置 添加Fastlane车道,选项 添加iOS Fastlane元数据 创建詹金斯职位 测试工作 系统总览 概念— Xcode 构建类型和目的地 苹果肯定喜欢使应用程序开发复杂化。 如本系列的第1部分所述,iOS的命名构建类型比Android多得多。 复杂性的主要驱动因素是供应配置文件。 每个配置文件都会限制可以运行您的应用的合格设备的数量。 发布版本只能在设备上运行,并且必须从beta或prod应用商店中安装。 […]

调试iOS-给初学者的小技巧

错误在每个人的生活中都是正常的。 但是,如果您是一名开发人员,那么它是日常生活,每小时生活的一部分。 当我开始编程时,我完全不顾为我们的工作提供的一些更重要的工具。 我的意思是:遇到了PHP错误? 让我们逐行阅读代码,直到弄清楚到底出现了什么不良值。 然后向我介绍了Codebug,尽管我很难弄清楚如何入门,但它开始成为我的开发环境的一部分。 好了,然后我决定再次练习iOS,这种新闻习惯使我意识到XCode调试器的功能多么强大。 如果您完全不熟悉,请给它一个机会! 转到代码的某一行,并通过单击左侧装订线设置断点。 这将创建一个蓝色标记,如下所示: 现在,还记得人们何时告诉您打印变量以发现其值吗? 这就是本文的重点。 您可以使用de LLDB(代表低级调试器)来简化此值! 只需在变量前输入“ po” , Code Sense将会帮助您: 选择一个变量,然后: 另外,请确保在底部选择正确的选项: 希望这可以为您节省大量时间,因为运行和仅捕获某些值的iOS可能需要几分钟。 干杯!

用Bamboo加快迦太基的建造

迦太基是一个出色的依赖项管理器,但是,当项目变得复杂时,构建时间可能会受到影响,尤其是在诸如CI之类的CI环境中。 本文详细介绍了我为缓解这些问题而开发的工作流程。 步骤1:配置链接的存储库 在我们的构建环境中,我们使用两组链接的存储库-一组专门用于迦太基,而另一组用于常规代码更改。 仅当检测到对Cartfile或Cartfile.resolved的更改时,工件特定的配置才会“运行”。 含义是要么更新了现有的依赖关系,要么添加了新的依赖关系。 在我们的构建配置中,我们使用Fastlane,它会在进行更改时自动添加标签“ fastlane的构建版本碰撞…”,我们特别将其添加到排除变更集,这样我们就不会以循环构建循环结束。 如果您不使用Fastlane,则不需要此行。 对于主存储库,我们将仅包含匹配的更改切换为排除与以下模式匹配的所有更改 。 这意味着,如果提交修改了Cartfile ,它将不会触发构建。 步骤2:计划设定 对于我们正在开发的每个ios应用程序,我们使用2个计划:一个应用程序-工件计划和一个应用程序构建计划。 实际上,我们还有其他计划来处理不同的分支和部署,但这超出了本文的范围。 构建计划:应用程序-工件 Artifacts计划负责运行Carthage并生成所需的项目依赖项。 我们发现此步骤运行起来很慢,而且不需要经常发生。 要配置此计划,您需要确保将其指向步骤1中配置的Artifacts存储库。 如下配置计划: 它具有一个单阶段和一个带有两个任务的 作业 : 源代码签出和一个运行以下命令的脚本 : 迦太基引导程序—平台ios —无用二进制文件 然后确保定义一个共享工件,例如: 运行carthage bootstrap时,它将依赖项下载到Carthage / Checkout文件夹中,然后将框架构建到Carthage / Build文件夹中。 因为我们只需要框架而不是源,所以我们仅在工件中包含Carthage / Build目录 建设计划:申请 该计划链接到在步骤1中配置的主存储库,负责日常构建应用程序。 除非您更改Cartfile中的内容,否则此计划将在每次推送的提交上运行。 在配置计划时-添加工件下载任务并选择上面定义的共享工件。 这将使用Carthage / Build文件夹填充您的构建目录,该文件夹将具有构建所需的所有正确动态框架。 关于如何配置适合您的构建任务-无论您使用Fastlane,xcodebuild还是xctool。 如果您使用Fastlane,请确保没有在Fastfile中调用迦太基任务,否则将重复所有迦太基工作。 触发建筑 最后一步是返回到“ Application-Artifacts”构建计划,并编辑“ Dependencies”选项卡,并确保该计划将在每次构建时触发“ Application”构建计划。 这样,如果更新了Cartfile,它将自动使用更新后的依赖项重新构建主应用程序。 摘要 在我们的环境中,我们发现在实施此构建方案之前需要花费多达40分钟的构建时间。 […]

在Swift中使用iOS UIResponder链打开URL

创建iOS应用程序时,我们发现需要一些按钮或UIControls打开URL链接。 这可以通过调用open(_:options:completionHandler 🙂轻松完成。 UIApplication的方法。 通过在iOS 9中添加SFSafariViewController,这为显示链接而无需用户离开应用程序提供了新的可能性。 虽然可以从代码中的任何位置调用UIApplication open(_:options:completionHandler 🙂 ,但仅从 UIViewController可以显示SFSafariViewController 。 我最近正在开发一个应用程序,该应用程序从JSON对象解析并构建交互式文档。 在构成交互式文档的多个对象中,有一个简单的链接对象。 如果用户点击链接,我们将在不离开应用程序的情况下将内容呈现在SFSafariViewController ( SafariVC )中。 应用程序的层次结构类似于下图: 在根目录下,我们有一个导航控制器,并在看到链接后有多个嵌入。 棘手的部分是将用户交互从链接一直传递到根视图控制器,因此我们可以通过将SafariVC推送到导航堆栈中来呈现SafariVC。 可以使用多种解决方案来解决此问题。 其中之一是将DocumentController分配为Link上TouchUpInside事件的目标,并使用didTapLink(_ link:URL)回调公开Delegate属性。 然后要求DocumentGridController将其父级分配为其子级的委托。 这似乎是一个可行的解决方案,但是它涉及很多约束: – LinkView必须是UIControl , – DocumentController需要了解Link , – TopicViewController需要遵守协议, – DocumentGridController需要知道其父项并将其分配给其子项。 这变得非常混乱并且难以维护。 最重要的是,如果我们从其他地方提供一个DocumentController ,会发生什么? 我们应该始终记住分配一个委托并实现相应的协议。 如果我们可以使用与iOS触摸处理相同的逻辑怎么办? 目的是在层次结构中传播打开链接的动作。 因此,该层次结构中的每个对象都可以决定是否可以打开URL或将其传递给下一个URL。 如果您不熟悉UIResponder链,我建议您阅读:使用Apple文档中的使用Responders和Responder链来处理事件。 这是一个图表,显示了如果使用UIResponder链进行URL调用,则传播将如何进行。 一旦点击链接,它将传播一个打开URL的调用。 所有中间视图和控制器都将转发它,直到到达将对其进行处理并推送SafariVC的TopicViewController为止。 这是协议和实施的片段: 每个符合URLHandler的类都可以通过响应者链接收URL请求。 UIResponder扩展中的函数broadcastURL将触发传播: 这将确保链尚未结束。 否则,将返回失败 然后它将检查下一个响应者是否无法处理URL。 否则,它将进行传播 如果下一个响应者可以处理URL,它将要求其处理URL。 […]

快速反应本机:立即开始使用JavaScript学习本机iOS开发!

本书是关于React Native进行移动iOS开发入门的指南。 您可以在https://github.com/azat-co/react-native-quickly中找到源代码和手稿。 您可以在此处或在reactnativequickly.com上在线阅读本书,或者, 如果您喜欢视频 ,可以在Node.University上观看项目视频:http://node.university/courses/react-native-quickly。 在本书中,我将向您介绍React Native,以进行本机移动iOS和Android开发……并迅速进行。 我们将讨论诸如 为什么React Native很棒 为iOS设置React Native Development Hello World和React Native CLI 样式和Flexbox React Native UI的主要组件 将模块导入Xcode项目 项目:计时器 项目:天气应用 这本书是关于快速开始使用React的,而不是关于React Native的,从技术上讲,它是一个单独的库(有些甚至可以称为框架)。 但是我认为在与React一起进行Web开发的八章工作之后,通过利用这个很棒的库将我们的知识应用于移动开发会很有趣。 您会惊讶于您已经从React中学到了多少React Native技能。 使示例过于复杂或过于简单,从而使它们不现实且无用,总是存在一个平衡。 在本书中,准备构建两个移动应用程序:Timer和Weather应用程序。 Weather应用程序具有3个屏幕录像,您可以在Node.Unversity上观看。 他们将引导您完成“天气”应用程序。 [边注] 阅读博客文章固然不错,但观看视频课程则更好,因为它们更具吸引力。 许多开发人员抱怨Node上缺乏负担得起的高质量视频材料。 观看YouTube视频让人分心,疯狂地花500美元购买Node视频课程! 去看看Node University,它在Node:node.university上有免费的视频课程。 [旁注结尾] 项目的源代码(以及提交问题/错误的手稿)在https://github.com/azat-co/react-native-quickly存储库中。 请享用! 为什么React Native很棒 React Native应用程序不同于混合应用程序或所谓的HTML5应用程序。 如果您不熟悉混合方法,那就是将网站包装在无头浏览器中的时候。 无头浏览器是没有URL栏或导航按钮的浏览器视图。 基本上,开发人员使用常规的网络技术(例如JavaScript,HTML和CSS)以及可能的框架(例如jQuery Mobile,Ionic,Ember或Backbone)来构建响应式网站。 然后,他们将其与该无头浏览器一起打包为本地应用程序。 最后,您可以跨平台重用相同的代码库,但是通常缺乏使用混合应用程序的经验。 与本机应用程序相比,它们通常不那么敏捷,或者缺少某些功能。 混合应用程序最受欢迎的框架包括Sencha […]

带有堆栈视图的可扩展单元

在表视图中有多种创建可扩展单元格的方法。 您很少可以在此博客或Google的某个地方轻松找到它们。 其中之一是苹果官方的“日期单元”演示代码。 但是,大多数描述都是通过直接在约束上使用操作来描述一些困难的方法。 今天,我想通过使用自iOS 9.0以来给我们提供的优势(称为UIStackView)来介绍一种更简单的方法。 我将建立一个简单的编程语言列表,并可能点击标题并显示简短描述。 设置表视图 第一步是设置表格视图。 我希望这个过程是您熟悉的familiar️。 我更喜欢将表视图数据源与主视图控制器分开,以保持代码的清洁和可维护。 为此,我创建了DataSource类,该类维护所有表视图源逻辑。 从数组中检索数据(例如在单元格上显示)的通用模式是这样的: items [indexPath.row] ,我想简化此过程,因此我编写了对数据源类的简单扩展: “ ProgrammingLanguage”只是一个表示表示单元格中显示的数据(图像,标题和描述)的结构。 您可以从我的GitHub页面(下面的链接)下载整个项目。 设置单元 前面的步骤是iOS表格视图的典型步骤; 现在我们将创建我们的单元。 我们应该从情节提要文件开始,将自定义单元格添加到表格视图中: 只需将单元格拖动到表格视图,然后对堆栈视图执行相同的操作。 您需要做的最后一件事是将两个或更多视图放入堆栈视图,并根据需要自定义其外观。 您应该遵循的模式是,第一个视图是对用户始终可见的折叠视图。 关键是为折叠视图设置一些高度。 在我的情况下为50,但是如果要创建更大的折叠单元格,则应设置其他值。 使用堆栈视图并手动更改其子视图的高度或宽度时,您还应该记住正确配置此控件。 这是我的细胞的一个例子: 如果您此时离开视图配置,看到扩展单元格“ 无法同时满足约束条件 ”时,您可能会感到失望。 ”显示在您的控制台上。 原因很简单-隐藏视图的高度限制为0 ,因此,如果扩展单元格,则将与堆栈视图的总高度发生冲突。 幸运的是,修复非常简单。 只需将折叠的视图高度约束优先级更改为999。 在对情节提要中的单元格进行样式设置后,我们需要将其连接到真实代码。 为此,我们需要创建一个继承UITableViewCell并根据需要进行基本设置的类。 这里的关键部分是创建单元状态,该状态描述了应该折叠还是扩展单元。 Swift枚举在这里会有所帮助。 如您在上面看到的,我添加了“ carretImage ”属性,该属性决定了在当前状态下我们应该在单元格上显示什么carret图像。 另外,我们需要允许我们更改单元格当前状态的属性或方法。 这里的逻辑很简单。 我设置默认状态(.collapsed),并使用观察者属性调用toggle()方法,该方法隐藏或显示我们的“展开视图”。 而已! 😆。 我们完成了单元-代码和UI。 设置拼图! 最后一步是将数据连接到单元。 我们通过实现cellForRowAt indexPath方法来实现 […]