Tag: Ios开发

Swift 4中的iOS UIKit:“自定义”按钮

预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIButton类 https://developer.apple.com/reference/uikit/uibutton 快乐编码😄

Swift 4中的iOS UIKit:调整UIImage的大小

预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIImage https://developer.apple.com/documentation/uikit/uiimage 快乐编码😄

面试过程-第2部分-iOS问题

您好,欢迎阅读本系列的第2部分。 如果您还没有,请检出第1部分。 因此,对于本文,我从列表中选择了10个随机(简单)问题,以下是他们的答案。 1. 自我介绍 这里没有太多解释。 您只需要谈论您的专业经验,教育背景和家庭背景即可。 因此,以下是您在简介中应涵盖的要点 · 教育背景 -新生应该在您的简介中包括此内容,因为您没有太多要谈论的经验,但是有多年经验的人可以避免这样做,因为他们可以直接谈论他们所做的工作。 · 家庭背景 –根据我的看法,这是可选的,您可以从介绍中忽略,除非并且直到您认为面试官应该知道一些非常有趣的事情为止。 · 专业经验 –经验丰富的专业人员应包括以下几点 · 多年经验。 ·当前/最后一家公司。 ·当前/上一个项目。 根据我的介绍,我仅介绍了一些重要的内容。 这仅是准则,而不是您必须遵循的规则列表。 如果您已经准备好一个经过充分准备和排练的介绍,那么使用它就不会有任何问题。 2. 完成最具挑战性的任务。 这是一个棘手的问题,您应该始终为该问题准备一个答案,因为如果尝试在面试中解决这个问题,那么在大多数情况下,您会想到的答案要么太简单,要么太难解释。 因此,最好对此问题准备充分的答案。 3. 列举一些您曾经使用过的iOS框架 这又是您应该事先准备的东西。 我一直在问这个问题,而我只记得UIKit 🤦🏽‍🤦🏽️。 我并不是说所有人都会发生这种情况,但事前准备没错。 4. 最新版本的swift中引入的新功能 每个新版本的swift都会引入新的变化,您应该知道这些变化。 您可以阅读或观看视频以保持最新状态。 您也可以参考whatsnewinswift网站。 在这里,您可以根据引入的所有swift版本跟踪swift中引入的所有更改。 5. 什么是闭包,它们是引用类型还是值类型? 我敢肯定,您中的许多人都使用过闭包,但是如果有人要求您定义或解释闭包,那么它将变得有些困难。 知道一件事是一回事,用正确的单词正确地解释它是另一回事,对吗? 无论如何根据迅速的文档 闭包是可以独立传递的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块,以及其他编程语言中的lambda。 因此,您可以使用以上定义来解释采访中的闭包。 对于问题的第二部分, 闭包是引用类型 。 请同时阅读以下主题(上述快速文档超链接中的详细信息)。 ·闭包的类型,即转义和不转义 ·尾随封口 ·自动完成关闭 […]

Xcode专家提示:JSON格式

如果您在源文件中具有JSON结构,则可能会得到如下所示的内容: 粘贴和保留格式。 使用保留的格式,我们得到: 如果您像我一样,并且倾向于将头撞在墙上,那么您只会默默地哭泣,浪费宝贵的时间来缩进混杂的JSON。 *我不够聪明,无法独自解决这个问题,一位心爱的同事与我分享了这个秘诀。

iOS开发中的Ruby历史

该帖子最初发布在我的个人博客中 。 阅读原始帖子,这样您就不会错过任何内容。 今天,2月24日是Ruby编程语言诞生25周年,因为它由日本的Yukihiro“ Matz” Matsumoto命名。 自从1993年发布以来,它已成为最动态,易学且最时尚的编程语言。 在iOS开发领域,Ruby几乎已广泛用于包管理,自动发布或使用脚本管理Xcode项目的任何地方。 这是为什么? 即使在iOS和Ruby中没有什么共同点,Ruby在iOS开发领域中正在做什么。 在本文中,我们将尝试找出Ruby在iOS开发和部署中存在的一些历史原因。 如果您不使用Ruby,则可能会发现您的语言中的库,最佳实践,设计模式,工具或框架在很大程度上受到Ruby最佳实践的启发。 我目睹了如此多的Swift,PHP,JavaScripts库,这些库是从原始Ruby库直接实现的。 RSpec已在PHP(PHPSpec),JavaScript(Jasmine)和Swift(Quick)中实现。 可能还有许多其他示例已由Ruby用其他语言实现。 不知道为什么Ruby如此流行,但这是因为语言的简单性,社区和生态系统使Ruby成为优秀的编程和脚本语言。 现在,我们将介绍在iOS开发中使用哪种基于Ruby的工具。 由于各种原因,iOS应用程序开发中积极使用了各种基于Ruby的工具。 最近,有人在Twitter上问了一个真正的问题, iOS Developer为什么经常使用Ruby? 这是一个有效的问题,因为除了苹果公司开发的项目外,几乎没有任何内部没有Ruby的iOS项目。 现在,我们将列出一些工具,这些工具在iOS开发人员中非常流行,并成为iOS开发的核心部分。 游牧人 可可豆 快车道 危险系统 xcpretty xcov 这些只是一些基于ruby的精选工具,但在iOS应用开发中可能还会使用更多工具。 现在,我们将简要介绍这些工具的背景知识。 由于Nomad-cli已被Fastlane工具取代,因此最近没有积极使用nomad-cli,但是Fastlane工具受到使用Ruby编写的nomad-cli的启发。 这是基于红宝石的工具开始出现在iOS开发中的早期参与者之一。 该项目为可以在nomad-cli之上编写的命令行工具奠定了坚实的基础。 这是用于将iOS应用分发到App Store的纯命令行界面。 您可以在此处阅读有关nomad-cli的更多信息 在nomad-cli之前,通常用于使用本地Xcode存档的应用程序,或者需要使用xcodebuild工具进行复杂脚本编写的应用程序。 xcodebuild生成的脚本通常非常冗长且难以维护。 它接受很多参数,每个参数都需要在脚本中配置,这很繁琐。 nomad-cli的作者Matt精通Ruby,开发了此工具来使用命令行解决iOS二进制分发问题。 不确定nomad-cli的作者为什么开始使用Ruby在Apple的本机技术上构建包装器。 看着mattt的Github仓库,他对Ruby十分精通,这也许就是他选择Ruby作为nomad-cli的原因。 CocoaPods是Ruby涉足iOS应用开发的项目。 CocoaPods是Xcode项目的依赖管理系统。 它被用来创建和分发Swift和Objective-C包,并在其他项目中重复使用。 CocoaPods具有可在Xcode项目中使用的所有软件包的集中存储库。 CocoaPods不是单个项目,而是使用Ruby编写的项目的集合。 这些项目包括Xcodeproj,CLAide,Molinillo,CocoaPods Core,Master Repo等。您可以在此处找到项目的详细信息。 在使用CocoaPods之前,在Xcode项目中管理依赖项确实很痛苦。 iOS工程师必须在Xcode构建阶段中手动链接框架。 Cocoapods通过内部自动化所有这些任务解决了这个问题。 CocoaPods的主要作者Eloy […]

使用Swift偷窥iOS 11拖放API

iOS 11带来了许多新的API。 这使我们能够使用户与应用程序的交互更加直观和愉快。 但是一个功能无疑引起了我的注意,它是不同应用程序之间的拖放。 我认为这是用户一次与多个应用交互的方式的改变者。 实现此功能似乎很困难,但我想向您保证并非如此。 今天,我们将构建一个简单的移动应用程序,允许用户将图像从任何应用程序拖动到我们的应用程序。 首先,您需要Xcode 9,可以从Apple官方网站下载。 如果您决定测试我们要在真实设备上构建的应用程序,请确保该应用程序可在iOS 11上运行。我们不会创建任何其他元素,我们将使用默认创建的ViewController类。 为了能够处理此拖放,我们将使用新UIDropInteractionDelegate方法。 您可以在应用程序中使用多种可选方法。 我们将仅需实现3种可选方法,这些方法将帮助我们组织和处理拖放过程: 另外,我们需要确保我们的类符合该新API协议。 我们必须告诉Xcode,我们的视图支持这种交互(图像的拖放)。 为此,只需添加UIDropInteraction并提及我们的ViewController类是此交互的委托: 与我们的视图添加新的交互之后,您的ViewController类应该具有以下内容: 好的,现在我们已经基本设置好一切,可以使我们的应用正常工作。 让我们从“拖放”会话中获取图片,并将其放在视图顶部。 我们将使用第一个委托方法来获取图片并处理Drag&Drop的结尾。 我将向您展示代码,然后将详细描述每个步骤: 现在让我们看看我们已经完成了什么: 放下之后,我们可以使用属性session.items访问我们的项目,该属性返回一个数组(因为可能会拖动多个项目)。 因此,我们遍历这些项目。 为了从拖动的项目中获取对象,我们调用itemProvider属性(这是一个仅获取属性),然后调用一个方法,该方法返回带有对象和错误的闭包。 注意:您还必须输入对象的类,在本例中为UIImage.self 然后,通过使用防护结构,我们检查错误是否为nil。 如果发生错误,我们将打印错误消息并退出此方法。 在此关闭中,我们收到了一个可选对象,因此我们必须检查它是否真的是UIImage类。 我们使用防护结构来做到这一点。 我们的方法dragItem.itemProvider.loadObject(…)做一些异步工作。 因此,如果我们想使用UI添加工作并将图像添加到视图中,则必须确保在主线程上进行操作。 最后,我们使用图像创建一个UIImageView ,并将此视图作为子视图添加到主视图中。 然后,将其框架设置为与图片的框架相同。 通过使用属性session.location(in: self.view)我们将UIImageView的中心放在手指上。 现在让我们检查一下结果: 我们实现了一项非常强大的新功能-拖放的基本功能。 作为开发人员,您不仅可以处理图像,还可以处理文本,链接等的拖放操作。在计算了用户将对象拖动到何处后,可以将其放在任何可视容器中: UITableViewCell , UICollectionView , UIView等。Apple提供了很多种类的委托方法,使您可以轻松实现此功能。 您可以在此Github存储库中找到所有示例代码。 感谢您阅读🙂

通过将功能构建为框架来提高iOS团队的生产力

向现有的大型代码库中添加功能是许多工程师在其编码生涯中将面临的挑战。 如果iOS应用程序已经存在了几年以上,那么它可能已经吸引了许多开发人员为许多功能做出了贡献,从而使其成为了许多版本。 通常,结果可能是非常大的代码库,具有不同程度的模块化,较长的构建时间,而且代码不是很干净。 Scout24上的iOS应用处于不久前还处于这种状态,我想与大家分享我们如何对开发环境进行重大改进以及带来的好处。 问题 如果您曾经在一个大型项目中使用Swift进行开发,那么即使稍作改动,您可能对构建整个应用程序模块所花费的时间太熟悉了。 关于如何改善总体持续时间,有大量资源。 Swift具有许多出色的语言功能,但是这些功能是以更长的编译时间为代价的。 即使进行了少量更改,您也可能要等待几分钟才能看到结果。 这确实让人分心,效率很低! 在编码时,时间和精力是您最宝贵的资源。 如何解决 较长构建时间的答案很简单: 使编译器构建更少的代码! 听起来很合理,但是我们如何实现呢? 答案是通过使用iOS框架将我们的代码划分为更小,更离散的功能块。 在此示例中,我们将从主应用程序模块开始,并添加一个包含一些UI功能的框架,该功能构成了我们将集成到我们的应用程序中的功能。 这有什么好处? 这么小的示例可能看起来并不明显,但是以这种方式进行开发的好处是巨大的。 当您必须将功能内置到具有大量旧组件的大型应用程序中时,它们特别大。 通过将功能构建为高度独立于主应用程序模块的独立模块,您可以将更多精力放在要创建的功能上。 您会发现,您被迫以仅公开应用模块所需内容的方式来组织代码,该代码往往更加清晰和经过深思熟虑,并且不太可能发展成意大利面条式混乱,因为这样做更困难这样做。 与框架一样,构建作为框架的功能的一个基本步骤是创建一个“包装器应用程序”,就像我们在本教程中所做的那样,该程序将您创建的功能最小化地集成到一个微型应用程序中。 该应用程序无需构建主应用程序模块所需的所有其他依赖项,因此构建时间将很快缩短。 创建一个新的应用程序工作区 您将需要为您的应用程序和功能所在的框架创建一个工作区。 首先单击Xco​​de中的File-> New- > Workspace 。 在要保存工作空间的位置创建一个新文件夹。 保存后,我们现在有了一个空白工作区。 现在,单击Xco​​de中的File-> New- > Project ,然后选择“ single view app”。 将项目命名为“ SimpleCounterApp”,并确保选择“ Swift”作为应用程序语言。 之所以这样命名,是因为它将仅包含应用程序模块。 在下一步中,选择保存SimpleCounter.xcworkspace的文件夹。 在“ 添加到”下,选择SimpleCounter工作区。 必须在Xcode中打开SimpleCounter.xcworkspace才能显示此选项。 创建项目并注意,现在我们有了一个看起来很无聊的项目。 让我们开始做一个框架! 我们将在以后的步骤中将功能集成到主应用程序中,因此现在无需执行任何操作。 再次单击文件->新建->项目 ,这一次,选择“ Cocoa […]

在Swift中作为观察员的闭包

随着Swift进入编程领域,为开发人员打开了大门,使开发人员能够通过使事情变得简单和紧凑将其思想转化为Apple平台上的应用程序。 Swift引入了许多新功能和概念,但是在这篇文章中,我们将讨论Closures,这是当今iOS开发人员中非常有趣且最流行的编码实践之一。 根据Swift文档: 闭包是可以独立传递的功能块,可以在代码中传递和使用。 闭包不仅是Swift独有的,而且在Swift引入之前,它们就存在于其他编程/脚本语言中。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambda。 我们大多数人都不熟悉闭包,但是很长一段时间以来就在我们的代码中使用它们。 在我们日常的编码实践中,有一些实例我们间接使用了闭包,但我们对此并不了解。 以下是下面提到的几个示例: 在第三方API的帮助下从服务器获取数据; 在这里,您不必等待数据任务完成并异步获取数据,并在收到响应后使用@escaping闭包将其还原。 使用视图动画,因为某些功能需要异步执行。 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这称为关闭这些常量和变量。 让我们快速看一下如何定义闭包: {(params)-> returnType in // statements} 让我们来看看闭包表达式: let fullname:(String,String)-> String = {(firstName,lastName)返回firstName +“” + lastName} fullname(“ Prashant”,“ Gautam”)//结果为Prashant Gautam 在上面的表达式中,闭包接受String类型的两个参数并将其连接起来并返回新的字符串。 闭包表达式中的参数可以是输入输出参数。 我们也可以使用可变参数,但您必须命名可变参数。 元组也可用作参数类型和返回类型。 注意: 闭包表达式语法中的参数不能具有默认值。 为了这篇文章的主题,我被限制不要过多地研究闭包。 您可以在此处找到有关闭包的广泛信息。 作为iOS开发人员,我们都知道Notifications和KVO 。 两者都用于通知多个对象,以响应应用程序或对象属性的某些更改。 让我们在闭包的帮助下创建自己的观察者。 相信我,将您自己的代码用于同一目的非常有趣。 让我们举一个基于UITabbar的应用程序的简单示例。 演示应用程序中有两个选项卡。 在第一个选项卡上,我们有一个按钮,该按钮触发更新以将新消息反映给作为观察者添加的所有对象。 首先,我们创建一个基于标签栏的应用程序,并在FirstViewController内添加一个按钮“ Update ”,以触发更新的消息。 为此按钮添加操作updateAction(_ sender:Any) 。 […]

在没有钥匙串和UserDefaults的情况下实施应用内购买

每个开发人员最终面临的应用内购买实施步骤之一是选择合适的购买记录持久性策略,这将使应用重新启动后可以访问付费内容。 坚持购买的最明显方法是在UserDefaults中存储一些值,该值将指示某些内容是否已解锁。 Owen Brown和Pietro Rea在UserDefaults上的两个教程中展示了这种方法,其中UserDefaults用于存储布尔标志以指示非消耗性产品的购买状态,以及Date实例以保留订阅到期日期。 由于缺少数据完整性保护,因此通常会批评这种解决方案,因为UserDefaults存在的内容作为普通二进制plist存储在应用程序捆绑包的“首选项”文件夹中,因此用户可以使用iMazing,iFunBox或iExplorer等软件进行编辑由AndrésIbañez在他2014年的帖子中展示。 尽管这是事实,但我想提一下,自从iOS 8.3开始,Apple在文件系统访问中引入了严格的权限限制,从而消除了从非越狱设备上从外部访问应用程序内部文件的权限。 说到越狱,值得提醒的是,近几年来它的流行性一直在下降,以至于先驱者说越狱已经死了。 从个人观察,我可以说,为最新的iOS版本发布越狱需要花费更多的精力。 从iOS 10开始,黑客至少需要6个月的时间才能越狱,普通的iOS用户可以使用。 这就是为什么我认为应用程序用户的任何重要部分篡改应用程序文件的机会都非常低的原因。 尽管如此,使用Keychain代替UserDefaults并不需要花费很多精力,如Axel Kee在他的帖子中所示。 原理是相同的-存储类似“购买”的字符串,作为购买产品的标识符。 值得一提的是,由于iOS 11(以及iOS 10.3 Beta)在卸载应用后会删除钥匙串中与应用相关的所有记录,因此,如果您希望在应用安装之间坚持进行应用内购买,则钥匙串将无济于事不再。 但是,还有另一种方法可以检查用户是否购买了某些东西,而无需依赖UserDefaults或Keychain而是使用收据,该收据在每次购买时都会由OS自动更新。 即使为此目的使用收据的想法已在Apple的“应用内购买编程指南”中明确记录,但似乎这种方法在第三方教程中并未引起注意。 造成这种情况的一个原因可能是这种持久性策略仅适用于非消耗性产品和自动续订的订阅。 如果您正在实施消耗性或非续订性订阅,那么您将拥有钥匙串或iCloud。 应用收据使用的第二个障碍是其复杂的结构,需要大量的技巧才能读取必要的信息。 Bill Morefield的教程很好地展示了在没有第三方依赖的情况下在Swift中读取应用收据所需要的内容。 值得庆幸的是,来自Cocoanetics的人们创建了一个Kvitto库,使使用应用程序收据的工作变得轻松。 最近,我使用应用程序收据作为购买的永久记录,在名为电子工程师助手的应用程序中成功实现了非消耗性购买和自动续订。 InAppPurchaseManager读取收据的方法如下所示: 该方法的前4行检查是否存在IN_APP_PURCHASE环境变量,该变量可在使用模拟器时轻松模拟各种应用内购买。 您可以在Axel Kee的这篇文章中阅读有关使用环境变量模拟应用内购买的更多信息。 该方法的其余部分只是通过比较产品标识符来解析收据以找到相关条目,并使用switch语句内的元组以及三元运算来返回适当的购买状态。 另一种值得签出的方法是paymentQueue(_:updatedTransactions:) : 在这种方法中,我仅将事件转发到BehaviorRelay (RxSwift库中的类),并在处理完所有交易后从应用收据中读取购买状态。 您可以在此要点中查看我的InAppPurchaseManager的完整代码。 多亏了RxSwift , Kvitto和应用程序收据,实现了应用程序内购买的实现并没有造成太大麻烦。

Swift4 Day36:我有钱,骰子

日期:8/10(三) 新的副本 上完魏巍老师的Swift3从入门到精通后,自己又乱开iOS副本,在Facebook粉丝团softnshareGroupBuy有很多udemy的课程免费代码。 iOS 11和Swift 4-完整的iOS应用开发训练营 因为有介绍想学新的iOS AR kit跟图像识别的方法,而且里面也有很多复习的基础内容,就跟着练习了,讲解内容超详细,不会从头开始教let var继续在学习过程中反覆带入观念。虽然没字幕有点吃力但也算是一种练习吧。 我有钱 Angela介绍了一个只用UI元素做一个应用在苹果商店上卖999块美金,超胡搞瞎搞的😂 然后让我们自己做一个之后放到udemy的QA栏位 骰子 但是好的程式码希望是可以不要重复写的。 所以用func包起来,让程式码更简洁也让读入画面时就直接是乱数。 魔术8 会给你类似的作业让你自己明确的去实作一个新的作品