iOS:如何使用可折叠部分构建表视图

第2部分。继续通过表视图采用协议和MVVM 这是我的“表视图”教程系列的第二部分,其中包含多种单元格类型。 在阅读了第一部分的多种回答和建议之后,我决定添加一些主要更新。 UITableViewController更改为UIViewController,并将TableView作为子视图。 现在,ViewModel符合TableViewDataSource协议。 NumberOfRowsInSection,cellForRowAt和numberOfSections是ViewModel的一部分。 这样可以将ViewController和ViewModel分开。 请在这里找到最终更新的项目。 感谢大家的贡献! 在第一部分中,我们创建了以下表格视图: 在本文中,我们将进行一些更改以使该部分可折叠:

每个iOS开发人员都应了解的iOS 12顶级功能

注意:这是原始访客博客的重新发布,我在 此处的 Bitbar博客上写道 在宣布推出三款新iPhone之后,苹果及时发布了iOS 12。 新的iOS版本在性能和用户体验方面具有丰富的功能,并在性能,安全性和隐私性方面进行了重大改进。 在为用户考虑这些新功能的同时,我们还需要考虑此版本对每个iOS开发人员和质量检查工程师的意义。 在这篇文章中,我们将探讨Apple新操作系统的一些主要开发和测试注意事项。 每个iOS开发人员都应了解以下新功能。 Xcode 10 新建系统 平行测试 xccov的代码覆盖率 创建ML Siri快捷方式 ARKit 2.0 CarPlay + Google Map 这些是iOS 12的一些特定于开发人员的关键功能。您准备好升级技术堆栈以支持这些iOS 12功能了吗? 正如我之前所说,这是我在Bitbar上的原始博客的转贴。 为了进一步了解面向开发人员和质量检查工程师的iOS 12功能,请在此处阅读Bitbar博客上的原始文章 让我知道是否错过了iOS 12的开发人员专用功能。 ======================================== 像XCBlog的XCTEQ发布的帖子一样? 您可能还会喜欢我们在 Github 上的一些开源项目, 或者在 Twitter 和 LinkedIn 上关注我们 XCTEQ 对于为Apple平台构建应用程序的公司 而言, 是生产力的提高。 让XCTEQ自动执行平台应用程序(iOS,macOS,tvOS)的构建,测试,发布,CI / CD管道,然后您专注于构建业务功能。 不要在错误的CI / CD和测试自动化工具上浪费时间和金钱,请接受专家的建议。 在 http://www.xcteq.co.uk上 查看XCTEQ产品和服务, 或通过info@xcteq.co.uk。给我们写信。

在iOS中将渐变颜色快速应用于文本

渐变颜色很酷,尤其是将它们应用于文本时。 当然,您可以打开Photoshop或Sketch,对文本应用渐变,导出为png等。在以后需要更改字体,文本,间距等时,这是非常有限的。让我们学习如何使它们全部发生码! 通过下载游乐场来遵循:https://github.com/kgellci/GradientColorsInSwift 创建带有渐变颜色的视图。 在将渐变颜色应用于视图时,CAGradientLayer是您的朋友。 现在是时候添加标签并为文本遮罩渐变了! 您当然可以使用情节提要和自动布局来设置视图和标签。 如果视图更改大小,则必须相应地更新渐变图层的大小。 这足以让您自己开始探索渐变。 通过遮盖imageView或UIButtons标题标签来尝试上述示例。 您还可以浏览Shift的源代码:https://github.com/kgellci/Shift Shift可让您通过定时动画或设备运动快速创建渐变(倾斜设备可移动渐变)。

使用阴影时提高性能的一种简单技巧

在开发过程中,我最近的iOS应用“为您放松声音”,我不得不面对一些问题和挑战。 其中之一是在滚动过程中滞后的集合视图。 刚开始时,我确定这只是模拟器而已,我对此并不太在意,但是随后我为iPhone进行构建,并且看到了与模拟器相同的滞后集合视图。 我深入研究代码,开始检查所有内容,一段时间后,很明显,集合视图性能问题是由两件事引起的:阴影和圆角。 事实证明,我一直用于阴影处理的代码并不是非常有效。 这是我以前使用的代码。 上面的代码将阴影添加到集合视图中的单元格中。 每次移动单元格时,都会重新绘制以这种方式创建的阴影。 因此,当我滚动集合视图时,所有单元格都被重新绘制了阴影。 这足以破坏iPhone 6s +上的流畅滚动。 幸运的是,它非常容易修复。 这是我现在使用的代码。 这两个简单的代码行使滚动收集视图超级顺畅。 它们允许绘图系统将阴影缓存为位图,然后重新使用它,直到需要重新绘制为止。 对于我的收藏视图单元格以及整个视图中几乎所有其他阴影,这是一个完美的解决方案。 因此,如果您的收藏视图(或其他任何视图)使用了大量阴影,并且在滚动过程中感觉放慢了速度,那么这也可能是您的解决方案! 这是我想与您分享的提高性能的第一(最简单)技术,第二将很快发布! 谢谢您的阅读,我希望您学到了一些有用的东西🙂

在Swift上使用函数式编程

在本文中,我将尝试以最简单的方式说明如何尊重函数式编程的构建块,该模型经过数小时的研究,发现它并未得到充分利用。 Swift是一个功能对象混合体,因此它为我们提供了应用功能编程的支持,无论是类型推断还是灵活的功能管理。 快速回顾一下范式: 函数是一个转换,它接受一个(或几个)参数并返回一个值。 函数也是范例的一等公民 ,这意味着它是一个值,可以将其作为参数传递给另一个函数,获取结果甚至存储它。 以Currying为基础,我们可以给函数提供比期望少的参数,因此它将给我们带来期望缺少参数的函数。 此概念称为部分应用程序 。 我们也可以像在数学世界中一样在彼此之间编写函数,只要第一个函数的输出与第二个函数的输入匹配即可。 我们还可以将函数作为其他函数的参数传递。 将其他函数作为参数接收的函数称为高阶函数 。 如果没有支持不可变性的上下文,这一切都是不可能的,这意味着我们的函数不会更改我们的数据,而是会给我们提供副本,这是将函数应用于原始数据的结果。 每次我们调用具有特定值的函数时,预期结果都是相同的。 这些概念是范式的基础,将它们组合在一起可以赋予我们极大的灵活性,更高的代码可重用性百分比,并使我们可以构建更具声明性的组件。 现在,我们如何在Swift这样的混合语言中应用这些概念,并专注于功能的一部分? 职能和一等公民 在任何事情之前,我们定义“添加”功能: func add(number:Int,otherNumber:Int)-> Int { 返回号码+其他号码 } 它的类型是: 添加::(Int,Int)-> Int 范式允许我们在恒定的情况下存储此函数: 让storedAdd:(Int,Int)-> Int =添加 或者也可以像这样直接定义: 让加= {(num(num:Int,otherNum:Int)in num + otherNum} 返回值是隐式的,类型是自动推断的。 这两个声明是等效的,因此它的使用取决于首选项和上下文。 定义函数后,假设我们要将5加到几个数字上: 让foo = add(5,1)let bar = add(5,5)let bla = add(5,100) 您在这里看到问题了吗? 在每种情况下,我们都重复相同的操作,即增加5。如果我们想再执行10次该怎么办? 样板代码。 如果我们要进行更改怎么办? 如果不是要加5,而要加20,该怎么办?复制粘贴不是一种选择。 […]

OX do Xamarin表格-分段控件

Fala galera, tudo beleza? 分段控制éum controle bem法律que pode ser utilizado para selecionar opõçéum子菜单,alterar oconteúdode uma tela ou等。 可以在iOS上运行的工具,可以在Android上实现必需的实现。例如,可以在Xamarin上实现。 Hoje lhes trago meu控制Xamarin.Forms.SegmentedButton参数解析器可解决问题。 Vamos ver como utilizar吗? 配置控制 Vamos ao nosso querido nuget baixar o pacote Xamarin.Forms.SegmentedButton e instalar no projeto compartilhado: Pronto sem maisconfigurações😀 Utilizando o controle Vamos criar uma MainPage可以简单地实现以下方式:xmlns:sb =” clr-namespace:Xamarin.Forms.SegmentedButton; assembly = […]

斯威夫特:边做边学

正如我所说的,我根本没有发布任何应用程序的计划–直到我上了Udemy的Geeky Lemon课程。 在编写了基本应用程序,设计并添加广告以及关闭广告的方法之后,他通过发布与我进行了交谈。 在不知不觉中,我已经在App Store上发布了一个应用。 Tap Stars在我的生日那天上线,并且仍可供下载-现在我正在了解一个新版本,有关Swift和iOS的更多信息。 瑞安·莫里森(Ryan Morrison)的《踢星》 自那时以来,我已经完成了数十门课程,遵循了在线指南并观看了YouTube视频,从而使我对自己构建基本应用和游戏的能力充满信心。 我的想法是我通过建造中学到的。 通过遵循指南和编码以及与其他人一起构建一个完整的应用程序,我比以往任何时候都可以教我更多的知识,从而更快地获得了更多的知识。 实际上,我最近已经完成了另一个对儿童友好的计算器应用程序–而不是一个屏幕来完成您具有加,减,减,除,乘和平方根屏幕的所有功能。 我遵循了一个指南,但是从他的代码中转移了很多,以一种更适合我的风格的方式来做。 我也已经开始研究macOS版本以练习跨平台工作。

10小时内的Appdevcon 2018

3月16日,我到达阿姆斯特丹的PathéArena。 今天,标志性的电影院都与 Appdevcon 有关, Appdevcon 是应用程序开发人员(主要)为应用程序开发人员而举行的年度会议。 我进入,迅速拿起我的徽章,然后上楼梯去会议厅。 在那儿,我加入了越来越多的排队等候咖啡的开发人员。 在他们的背后,像CocoaheadsNL,荷兰Android用户组,Appsterdam和Egeniq(活动组织者)这样的赞助商正在共享美食。 拿到急需的黑咖啡和一瓶水后,我去了13号馆进行当天的第一次演讲。 演讲者:Ash Furrow ( Artsy ) 主题:通过建立更好的团队来构建更好的软件 一个非常鼓舞人心的演讲,与实际的发展无关。 相反,Ash专注于管理心理学以及如何为在那里的团队创造最佳的工作环境-从而构建更好的软件。 简而言之:创造一个每个人都感到安全,没有任何羞辱的空间,并有足够的空间进行公开讨论。 这将使人们指出错误,承认错误,最重要的是从错误中学习。 怎么样? 假设每个人都在尽自己最大的努力,预期并解决苦难,并始终表现出同情心。 此外,Ash推荐Radical Candor作为一本不错的书,并总结了协同作用的概念,因为“……团队是团队合作的总和”。 演讲者:保罗·哈德森( 用Swift破解 ) 主题:如何像专业人士一样进行调试 Pauls的话题全部是关于iOS和Swift的。 Paul从一个非常熟悉的示例开始,在代码中包括print()来检查问题,然后是另一个print()然后是另一个,然后是另一个……然后,您明白了。 Paul提供的解决方案很简单: 断点 。 他演示了如何使用它们在激活时自动打印东西或播放声音。 Paul解释说,而不是删除断点,而是检查BreakpointManager枚举以使其为有条件的。 假设您要调试登录流程。 将BreakpointManager.login设置为’true’,所有登录流程断点将被激活。 由于某些断点适用于所有应用程序,因此您甚至可以在团队中共享它们。 Paul还分享了其他有用的调试技术,该网站真棒,使他们对Assert,Precondition和FatalError有所了解,并为我们提供了许多新的见解。 咖啡时间(休闲时光! 在拍摄下一张咖啡因时,我遇到了前同事Dylan Drost,他刚刚在Cross Platform大厅完成了关于Flutter的演讲。 我请他分享精彩片段,他很高兴地做到了: Flutter的当前状态,例如Dart语言的自定义渲染引擎 Flutter当前缺少可用于生产的内容,例如视频播放和其他基本本机功能 Google大量投资Flutter和Android,因此实际上是在与自己竞争 Google的新操作系统Fuchsia可能会在Flutter被采纳为Android的替代品时发挥作用 我很快又给自己喝了杯咖啡,坐下来进行下一次演讲。 演讲者:Phil Nash( Jetbrains ) 主题:可选不是失败 Phil首先讨论了函数的域和共域,并继续探讨Swift的发展方式,在错误处理方面缺乏该语言,以及如何以及为何引入可选函数。 […]

使用MapKit和CoreLocation查找当前位置

目前,我处于项目模式,这是我在Flatiron学校的最后阶段。 与小组成员交谈后,我意识到我对使用mapKit或CoreLocation不熟悉。 因此,我决定尝试使用它来尝试在地图上找到我的当前位置。 以下是我采取的步骤: 1.在Xcode中启动一个单一视图项目。 2.(可选)创建项目后,转到情节提要,然后将视图控制器嵌入导航控制器中。 转到编辑器,单击“嵌入”,然后选择导航控制器。 3.在项目右侧的“实用工具”部分,搜索“ Map Kit视图”并将其拖到视图控制器中。 扩展视图的大小以填充屏幕,然后添加缺少的约束(您可以使用三角形的“分辨工具”,位于编辑器的右下角)。 4.现在,在助手编辑器中,控制并拖动视图控制器中的地图视图以创建出口。 5.进入您的info.plist文件,并在信息属性列表下添加字符串类型为NSLocationWhenInUseUsageDescription的键。 该值可以是任何描述。 6.在视图控制器中,导入mapKit和核心位置。 7.使用CLLocationManger添加位置管理器属性,并在viewDidLoad中,在加载视图后立即设置位置管理器。 8.最后,添加位置委托方法:获取传入的最后一个位置,找到位置的中心以及通过定义要显示的地图部分来创建区域。 9.点击运行! 这就是我得到的。

创建通用(胖)Swift框架

作为Wireless Registry的移动开发人员,我一直在调整,升级和个性化我们的iOS和Android SDK,以供开发人员集成到他们的应用程序中。 当然,在任何人使用板载SDK将应用程序投入生产之前,他们需要在一系列设备和操作系统版本上对其进行测试。 多年来,尽管拒绝具有冗余架构片段的二进制文件一直是App Store审核过程中不受欢迎的怪癖,但绝大多数iOS开发人员至少部分地依赖模拟器来进行方便的版本和设备测试。 因此,我通常为开发人员提供准备好发布的框架,其中包括对真实设备体系结构(ARMv7,ARMv7s,ARM64)的唯一支持,以及带有“胖”二进制文件的框架,除实际设备外,还可以在模拟器上进行测试。 在本文中,我将描述将Swift框架转换为胖二进制文件的最快方法(不过,如果您有几分钟的时间,则应在Build Phases中设置运行时脚本,而不要使用命令像我这样的线)。 首先,创建Swift框架 在XCode中创建一个新的框架项目,选择“框架和库”,突出显示“ Cocoa Touch Framework”图标,然后命名您的项目。 将所有Swift文件添加到项目中,并确保将要从外部访问的所有类/方法都声明为public。 最后,确保已将调试版本的“仅构建活动体系结构”设置为“ 否 ”: 现在,使框架通用 打开命令行,导航到可以保存临时文件的目录,然后输入(但不执行): $ lipo -create -output YOUR-FRAMEWORK-PROJECT-NAME 现在,回到您的框架项目并运行两次:一次以连接到计算机的真实设备为目标,一次以模拟器为目标。 然后,在“产品”文件夹下,右键单击YOUR-FRAMEWORK-PROJECT-NAME.framework,然后选择“在Finder中显示”。 您应该看到一个类似于以下内容的目录结构: 右键单击Debug-iphoneos框架内的可执行文件 目录,按住Option键,复制其路径,然后将其粘贴到命令行中。 添加一个空格,然后对Debug-iphonesimulator框架目录中的可执行文件执行相同的操作。 您的命令行现在应如下所示: $ lipo -create -output您的框架项目名称实设备可执行路径名仿真器可执行路径名 现在执行它! 结果应该是您指定目录中的新可执行文件。 删除Debug-iphoneos框架目录中的可执行文件,并将其替换为刚创建的可执行文件。 最后,将Debug-iphonesimulator版本中的i386和x86_64切片从Debug-iphoneos目录拖到.swiftmodule文件夹中。 现在,您在Debug-iphoneos中的框架目录是通用的! 最后,将框架导入Swift项目 要亲自查看,请启动一个新的Swift项目,导航到项目窗口内的“常规”选项卡,然后将.framework目录拖动到Embedded Binaries(选择“如果需要,复制项目”)。 现在,只需导入框架,在代码中的任何位置调用其方法和类,然后在真实的设备或模拟器上运行它即可!