Tag: iOS 11

使用Core ML和Vision Framework进行图像识别

Core ML为开发人员提供了许多构建诸如图像识别,自然语言处理(NLP),文本预测等功能的可能性。 现在您将想到,很难在应用程序中实现这种类型的AI,但是令您惊讶的是,Core ML非常易于使用。 在本教程中,我们将看到只需几行代码即可将Core ML集成到我们的应用程序中。 那不是很酷吧? 让我们开始吧。 应用概述 我们正在尝试制作的应用程序非常简单。 我们的应用程序将允许用户从相机拍摄照片或从其照片库中选择照片。 然后,机器学习算法将尝试预测图片中的对象。 结果可能不准确,但是您将了解如何在应用程序中应用Core ML。 让我们开始吧。 建立专案 首先,使用Xcode 9创建一个新项目,然后选择单视图应用程序模板,并确保将语言设置为Swift。 创建用户界面 让我们首先移至Main.storyboard文件并添加一些UI元素。 在视图中添加UIImageView,UILabel和UIButton。 默认情况下,我向UIImageView添加了一个默认图像,此后有一个UILabel将显示其可信度的预测答案。 最后,有一个UIButton将帮助我们从“相机”或“照片库”中拾取图像。 让我们继续前进。 移至ViewController.swift文件并在UIKit import语句正下方导入Core ML和Vision。 在这里,您可以看到准确性没有达到目标,但是我们仍然可以清楚地知道如何使用Core ML模型。 您可以通过以下链接了解更多信息: 核心ML | Apple开发人员文档 Core ML针对设备上的性能进行了优化,从而最大程度地减少了内存占用和功耗。 正在运行… developer.apple.com 机器学习-Apple开发人员 充分利用Core ML这一在苹果产品(包括Siri)中使用的新的基础机器学习框架。developer.apple.com

iOS 11定位技术的新增功能

在许多iOS应用程序中,访问用户的位置是一项重要功能。 在最近的iOS 11更新中,访问位置的方法已进行了一些更改。 让我详细介绍有关在iOS 10以及更新iOS 11之前和之后访问位置的方式的详细信息。 iOS 10及更低版本 开发人员可以使用以下方式访问位置: 1.“使用时”访问 2.“始终”访问 1.“使用时”访问 当应用程序当前处于活动状态时,开发人员将使用“使用时”访问权限。 在某些情况下,当应用程序处于后台时,该应用程序需要跟踪位置,但是“使用时”访问仍然足够。 在后一种情况下,状态栏下方会显示一个蓝色栏,表示该应用正在跟踪您的位置。 Info.plist文件中使用NSLocationWhenInUseUsageDescription键描述了为什么应用程序需要访问该位置。 在设置应用程序中,用户可以在选项“ 从不 ”和“ 使用应用程序时 ”之间进行选择。 2.“始终”访问 开发人员将“始终”访问权限用于需要跟踪您的位置的应用,即使您的应用未处于活动状态也是如此。 API就像重大更改API,它会在用户移动到特定距离时发出通知,而区域监视API会在用户移动或离开特定位置时发出通知。 Info.plist文件中使用NSLocationAlwaysUsageDescription键描述了为什么需要始终访问应用程序的原因。 在位置许可设置中,将显示“ 从不 ”和“ 始终 ”。 从iOS 11 使用上述“使用时”访问权限的那些应用程序没有重大变化。 但是根据苹果公司的报告,有21%的应用程序使用“始终”访问。 这些应用可能必须重新考虑所做的更改才能完美运行。 在开发适用于iOS 11的应用时,无论您要求的许可类型如何,都应提供NSLocationWhenInUseUsageDescription 。 如果需要“始终”访问,则应在info.plist中另外提供NSLocationAlwaysandWhenInUseUsageDescription键。 因此,从现在开始,说明应包含用户在相应模式下可以使用的功能。 注意:但是, 需要 “ NSLocationAlwaysUsageDescription ”才能支持iOS 10及以下版本的向后兼容性。 三种访问位置的方法: 1.“使用时”访问 2.“始终”访问 3.先“使用时”访问,然后再“始终”访问 1.“使用时”访问 它在iOS 11上的工作方式也与以前相同。 2.“始终”访问 现在,在这种情况下,以前会向用户提示“允许”或“不允许”。 […]

IOS面试问答(2019年1月)第3部分

iOS面试题2019 本文包括来自VMware的有关IOS职位的更多问题。 希望对您有帮助。 下一篇: IOS面试常见问题解答(2019年1月)第4部分 如有其他疑问,请查看以前的文章-2018/2019年度IOS面试常见问题解答 Q1。 您使用了哪个应用程序,为什么使用了MVVM,MVC? 回答 : MVVM 首先,关键优势在于实现view和model之间的真正分离。 实际上,这意味着如果/当您的模型需要更改时,它可以不需要视图,反之亦然。 其次,虽然model可能包含view可能需要的所有数据,但您可能希望以model不支持的方式抽象该数据。 例如,假设您的模型包含date属性。 在模型中,它可以单独作为DateTime对象存在,但是您的视图可能希望以完全不同的方式呈现它。 如果没有viewmodel您将不得不复制model的属性以支持视图,或者修改可能严重混淆“模型”的属性。 您还可以使用viewmodel模型来聚合模型中存在于单独的类/库中的部分,以简化view的处理流程。 您不太可能希望以用户希望或希望将数据呈现给他们的相同方式来处理代码中的数据。 最重要的是,您还支持view和viewmodel之间的自动双向数据绑定。 是什么激发了MVC MVC的核心是我所说的“独立演示”。 分离演示的背后思想是在建模我们对现实世界的感知的领域对象和作为屏幕上看到的GUI元素的演示对象之间进行清晰的划分。 域对象应该完全独立并且可以在不引用演示文稿的情况下工作,它们还应该能够支持多个演示文稿,并且可能同时支持。 Q2。 为什么我们要在主线程上执行UI操作? 回答 :由于某些原因,您必须在主线程上更新UI。 第一个是在Cocoa Touch中,在主线程上设置了UIApplication。 这是启动应用程序时实例化的应用程序的第一部分。 屏幕上的所有视图(例如您正在使用的标签)都是该UIApplication实例的后代。 因此,当您点击按钮或使用按钮时,这些必须在主线程上进行更新,因为它们是主线程的一部分。 同样,任何来自按钮或标签的事件(例如敲击或捏)都将是主线程的一部分,应在此进行处理。 另一个原因是图形渲染:iPhone的图形管道最终是同步的。 假设您正在使用UILabel,即屏幕上的一些文本。 您等待异步请求返回,也许是包含iPhone用户名的用户数据。 数据输入后,您将使用用户名更新标签。 UIKit是UILabel所属的框架,然后在屏幕上呈现文本。 它将光栅化字体(因为字体是矢量),然后将文本转换为像素。 当该文本是混合层的一部分时,例如在剪切或应用透明度时,图形渲染器将计算应显示标签的哪个像素。 然后将这些像素与屏幕的其余部分放在一起,每秒最多60次。 绘制到iPhone屏幕上(点亮LED显示屏上的像素)是需要立即进行的过程,屏幕上的所有像素都必须同时出现。 从定义上讲,异步编程不是同步的,而是并行的,您不确定异步操作何时完成。 如果允许异步绘制到iPhone显示屏,则可能会出现大量的闪烁和丢失的零件,因为在渲染整个屏幕时尚未准备好对该零件的处理。 最终,在主线程上更新UI更加简单。 它可以为您节省大量决策,需要解决的问题和错误。 当然,只要UI的更新是同步的,就可以在异步线程上创建UI的一部分。 一些例子: 将滤镜或图形效果应用于视图,例如圆角或使用CIFilter。 这些过程非常密集,您需要对其进行缓存,并在将它们绘制到屏幕之前在异步线程上分派它们。 创建动态图形,例如动画。 您首先要处理它们,然后播放处理后的动画。 绘制图形和生成的图像也是如此。 下载网络资源(如用户数据),然后同步更新UI。 […]

适用于iOS的简单立体声和ARKit

希望为希望利用iOS 11新型基于ARKit SLAM的世界跟踪器将SceneKit游戏扩展到Google Cardboard的用户提供一些快速模板代码。 主要组件是SLAMRunner,它在您和ARKit的ARSession之间进行中介。 第二个是一个简单的StereoViewController,它将您的SCScene附加到立体声“头节点”上。 可以根据自己的喜好调整摄像机的值,但普通用户对启动器的内在功能感到满意。 DualViewController.swift是一个示例类,它以100倍的喷射量实现了入门级XCode场景。 这是存储库: mikezucc / SimpleStereoARKit SimpleStereoARKit –关于在没有ARScene的情况下使用ARKit的简单参考指南,以及用于附加的简单便捷类…… github.com SLAMRunner.swift 裸露的简单对象即可运行基础ARKit SLAM。 这将以matrix_float4x4的形式向matrix_float4x4提供更新,该更新是matrix_float4x4的类型别名。 您可以使用诸如headNode?.simdTransform = transform这样的值来更新SCNode的位置。 像这样附加: tracker = SLAMRunner() tracker?.delegate = self 像这样接收更新: protocol SLAMRunnerDelegate { func updatedTransform(_ transform: matrix_float4x4, imagePixelBuffer: CVPixelBuffer) // plz lock up your buffers necessarily func trackingBadState(_ status: SLAMRunnerStatus, trackingState: ARCamera.TrackingState, error: Error?) } […]

在iOS 11上使用MapKit进行集群:第2部分

在第一部分中,我们研究了MapKit实现注释集群(iOS 11的一项新功能)所涉及的一些高级概念。正如该帖子的结论所指出的,我们还有许多工作要做,以使我们的简单应用程序更加实用,并使其代码更具可读性。 在第二部分中,我们将做到这一点! 首先,快速回顾一下。 您可能还记得,在应用程序中建立注释集群并运行的过程非常简单: 在地图上的狭窄区域添加多个注释。 为MapKit提供每个注释的MKAnnotationView实例, MKAnnotationView注意适当地设置其clusteringIdentifier 。 为MapKit提供其他MKAnnotationView实例, MKAnnotationView用于MKClusterAnnotation类型,这些实例在运行时自动生成。 享受您整洁有序的地图! 大部分工作都是在单个MKMapViewDelegate方法( viewFor )中完成的,并且所得的项目虽然简单易用,但可能会更强大。 因此,让我们进行一些重构! 我们将从更新MapItem ( MKAnnotation MKAnnotation的数据类型)开始。 在第一部分中, MapItem非常简单:它具有CLLocationCoordinate2D类型的单个属性,这是MKAnnotation要求的MKAnnotation 。 在我们更新的应用程序中,我们希望地图上的颜色更加多样化,因此我们将扩展MapItem以包含ItemType ,这将确定地图上注释的颜色: 如您所见,我们的集群现在可以显示有关它们包含的数据的更多信息,并且导航地图要直观得多。 繁荣! 🎉 希望您已经学到了一些有关MapKit的功能的有用技巧,这些技巧在iOS上的注释集群方面比本迷你系列的第1部分和第2部分更重要。 我们已经从一个显示该系统工作原理的超简单示例,变成了一个具有生产就绪代码的更复杂示例(借助Swift🤓的强大功能使其变得优雅)。 谢谢阅读! 如果所有这些地图都让您感到有些迷茫,请在下面发表评论,在Twitter @worthbak上打我,或在Github上查看完整的项目。 否则,编码愉快!

iOS 11应用开发:创建Spotify克隆免费Udemy课程。

音乐是所有应用商店中最大的应用类别之一。 他们有潜力获得可观的收入。 了解使用流行的编程语言Swift 2构建功能齐全的iOS音乐流应用程序所需的基本概念,工具和功能。还学习如何设置自己的服务器以及上传最终将要播放的音乐。 您将学到的东西 Xcode安装和设置 iOS上的基本流功能 如何设置服务器(免费或付费) 如何使用PHP在服务器上自动对音乐文件建立索引(无需PHP经验) 如何使iOS应用与服务器通信 如何添加锁屏控件 如何添加锁屏媒体信息 如何处理电话等音频中断 如何在iOS上创建表视图和自定义表视图单元 动态地向您的应用程序和远程数据库添加更多数据 在Facebook上分享歌曲信息 跟踪我们的远程数据库 触手可及的强大技能 通过学习创建iOS应用以及PHP和MYSQL后端,您将对潜在雇主产生难以置信的价值。 将这两种技能结合在一起是开发人员被雇用为初创公司的第一原因。 这些创业公司需要这些信息,并愿意为此付出代价! — — — — 奖金 — — — – 您不仅可以学习iOS应用中流音乐的来龙去脉,而且该课程还包括大量奖励。 我教您如何创建和设置执行以下操作的功能齐全的服务器: 自动扫描新上传的音乐并将其添加到MYSQL数据库(无需您输入任何内容) 生成允许您的应用访问后端的PHP文件 — — — — — — — — — — — — — — 内容和概述 本课程无需编程知识,但会有所帮助。 如果您是一个完整的初学者,请参加我的其他课程(适用于完全和完全初学者的iOS应用)。 您将被带往以下过程: 如何在免费或付费服务器之间进行选择 如何在iOS上编写简单的流功能 如何向您的应用程序添加高级音频功能 […]

入门:iOS开发(Swift 4)

从无到有的开发指南 介绍 我们正在努力使本教程系列对您来说尽可能简单。 您将通过完整的源代码学习iOS开发的所有核心概念。 不要等待,让我们深入了解新的iOS世界。 仅需5个步骤即可开发您的第一个应用程序 步骤1:设定您的MAC机器 从Apple Developer Site下载Xcode9。 确保已安装macOS 10.12.6或更高版本。 下载Xcode后,解压缩.xip文件。 现在,摆在您面前的是iOS开发的第一步。 📱 以上帝的名义-最仁慈,双击打开Xcode。 步骤2:设置您的第一个应用| HelloUniverse 选择创建一个新的Xcode项目 选择“ 单视图应用程序” ,然后单击“ 下一步”。 提供您的第一个应用程序的名称,假设它是HelloUniverse 建议不要在产品名称中使用空格 现在选择无团队 添加组织名称,在这里使用队长 。 您可以在此处将您的名字用作组织。 添加组织标识符: com.captain.HelloUniverse (com.companyname.appname) 选择语言Swift 单击下一步,然后创建您的第一个应用程序。 在这里,您可以使用屏幕上的第一个应用程序 步骤3:执行应用程式 按Command⌘+ R运行应用程序 它将启动iOS模拟器并运行您的第一个应用 感到兴奋和快乐? 😃 这是您在iPhone X上运行的第一个应用程序-模拟器 如果您无法在iPhone X上运行您的应用程序,请不要担心。 只需单击Xco​​de的TopLeft一侧的模拟器区域即可更改模拟器 选择任何iOS设备模拟器,然后再次运行您的应用 步骤4:向Universe问好 现在我们在屏幕上看不到任何内容,让我们在屏幕上添加一些内容 通过单击打开Main.storyboard 故事板是一个文件,用于设计屏幕并布局所有组件,例如按钮,标签,列表,选项卡和导航栏等等。 现在您将看到空白视图,其中没有任何内容,请放心,我们将添加标签向Universe打个招呼。 单击视图的中心(屏幕上方带有箭头的视图)以将其聚焦 此视图是屏幕的主视图,您将看到的所有内容都将在此屏幕内 在屏幕的右下角,您将找到4个标签,选择第三个标签,即对象库 […]

从UIWebView过渡到WKWebView(iOS)

根据Apple文档的重要说明: 从iOS 8.0和OS X 10.10开始,使用WKWebView将Web内容添加到您的应用程序。 不要使用UIWebView或WebView。 WKWebView优于UIWebView的优点: 在应用程序的主要流程之外运行 使用Nitro,更快的JavaScript引擎 异步处理JavaScript 消除某些触摸延迟 支持服务器端身份验证挑战 支持认证自签名安全证书和有错误的证书

使用RxSwift在ViewController之间传递数据

我2年前开始进行iOS开发,从Treehouse,Raywanderlich,objc.io和GitHub学习。我使用委托将数据从一个ViewController传递到另一个ViewController。我们可以使用RxSwift在几行代码中实现相同的任务。根据标准Rx代表文档 Rx是通过Observable接口表示的通用计算抽象。 像原始的Rx一样,RxSwift的目的是实现异步操作和事件/数据流的轻松组合。 KVO观察,异步操作和流都在序列抽象下统一。 这就是为什么Rx如此简单,优雅和强大的原因。 为了从rootViewController上的推送的viewController传递数据,我们可以轻松做到。 我们必须在SelectedDataVC类的ViewController类上传递数据,让我们深入了解一下。 1.使用CocoaPods,Carthage安装RxSwift和RxCocoa 2,在SelectedDataVC中添加变量和可观察变量 私人让selectedVariable =变量(“”) var selectedObserver:Observable { 返回selectedVariable.asObservable() } selectedVariable是具有一些String的初始值的变量。 selectedObserver是Observable which做一些工作,观察者可以对此做出反应。 当用户从SelectedDataVC中选择一些数据时,只需将数据值设置为selectedVariable selectedVariable.value = selectedName 在ViewController类中添加DisposeBag。根据文档: 处理袋用于将类似ARC的行为返回给RX。 当DisposeBag被释放时,它将在每个添加的一次性物品上调用dispose。 现在,当某些用户单击加号图标以在ViewControllerVC中设置数据时,则SelectedDataVC将被推入堆栈。添加以下代码行: 让selectedItemVC = self.storyboard?.instantiateViewController(withIdentifier:“ SelectDataVC”)作为! SelectDataVC selectedItemVC.selectedObserver .subscribe(onNext:{[弱自我] selectedName在 如果selectedName.count> 0 { self?.displayLabel.text = selectedName } } .disposed(作者:disposeBag) self.navigationController?.pushViewController(selectedItemVC,animation:true) 在实例化SelectedDataVC的过程中,我们正在ViewController类中订阅SelectedDataVC的事件,每当selectedVariable值更改时,我们在ViewController类中的标签就会更新。 这是完整的演示代码:https://github.com/EonKid/RxSwiftDemo 感谢您的阅读。如果您有任何疑问,请发表评论。

UIFontMatrix

苹果在iOS 11的UIFONT中引入了新的可访问性功能,称为“ UIFontMetrics ”。 基本思路: 它是获取支持应用程序中动态类型的自定义字体的对象。 概述: UIFontMetrix允许在您的应用程序中添加自定义可缩放字体支持。 您可以通过设置应用程序更改辅助功能字体大小,该设置应用程序直接反映在包含动态系统字体类型的应用程序字体中。 在iOS 11上,apple允许用户根据用户的可读性设置辅助功能字体大小。 应用支持动态类型 ,可根据您的首选阅读大小进行调整。 分步集成: 您需要在viewDidLoad()中调用“ showFontAndFamily”方法。 强制性的,我们需要打开上图中提到的更大的辅助功能大小 。 启用了字体滑块,可以根据您的选择使用和设置字体。 现在打开您的应用程序。