您是否知道创建地图视图并在其上放置注释(图钉)?它不会显示所有图钉。 首先,您想知道缩放是否存在问题。 但是没有问题。 iOS就是这样管理的。 它希望避免具有许多彼此重叠的图钉的地图视图。 因此,它对引脚进行了优先排序,并显示了更高优先级的引脚。 然后,当您放大屏幕时,其他针脚将出现。 但是,您可以根据需要更改此默认设置以查看所有引脚。 甚至更好的主意是拥有一个群集地图,该地图可以显示每个针脚隐藏了多少针脚。 我将首先进行设置,即在屏幕上显示所有引脚。 MKA注解: 用于将您的内容与特定地图位置相关联的界面。 采用此协议的对象管理要在地图表面上显示的数据。 它不提供地图显示的视觉表示。 相反,您的地图视图的委托提供了 MKAnnotationView 显示注释内容所需的对象。 这意味着任何具有坐标的对象(MKAnnotation协议的方法)都可以传递给addAnnotation(地图视图对象的方法)。 所以我们有别针,但是他们的看法呢。 如苹果文档中所述,地图视图的委托提供了 MKAnnotationView 宾语。 因此,如果要更改注释视图,则应定制一个。 我们可以这样做(因为此方法会在要渲染该地图视图时通知并返回注解的视图):func mapView(_ mapView:MKMapView,viewFor注解:MKAnnotation)-> MKAnnotationView? 这是MKMapViewDelegate的方法 MKAnnotationView类的属性之一是displayPriority。 默认情况下,此属性设置为highPriority,这意味着仅显示更高优先级的注释。 因此,如果要查看所有注释,只需将其设置为.required。 在下面的示例中,我展示了一个示例:(我创建了一个示例位置,并将其显示在地图视图中,在这里,我只是放置了返回批注视图的函数,如果您想要该项目,则可以从下面的链接中获取它) 关于创建MKMarkerAnnotationView的注意事项是MKAnnotationView的子类。 要创建视图,最好使用dequeueReusableAnnotationView。 返回通过其标识符定位的可重用注释视图。 出于性能原因,通常应重用 MKAnnotationView 地图视图中的对象。 随着注释视图移出屏幕,地图视图将它们移至内部管理的重用队列。 随着新注释在屏幕上移动,并提示您的代码提供相应的注释视图,您应始终尝试在创建新视图之前使现有视图出队。 在对性能至关重要的操作(如滚动)中,出队可节省时间和内存。 好的,完成了。 您可以在地图中包含所有注释。 但是仍然可以重构代码以使其更整洁。 您可以删除所有用于创建注释视图的方法,并使用地图视图的register方法。 在使任何视图出队之前,请调用register方法告诉地图视图如何创建新的注释视图。 您只需要在视图控制器外部创建注释视图类,然后将其显示优先级更改为.required。 amirhossein828 /地图集群 通过在GitHub上创建一个帐户为Map-Clustering开发做出贡献。 github.com
在这个简短的练习中,我创建了一个使用Swift,Xcode和Kitura与服务器组件共享代码的应用程序。 此练习的目标如下: 创建一个环境,其中Xcode是唯一的IDE 创建三个Xcode项目:移动应用程序,服务器端应用程序和共享业务逻辑 移动应用程序和服务器项目必须共享相同的业务逻辑 该设置必须与Cocoapods和Swift包一起使用 我通过创建一个小的“记录笔记”应用程序来实现上述目标,该应用程序将文本笔记存储在客户端的设备上,并在客户端选择保存或删除笔记时将数据同步到服务器。 客户端和服务器使用内存存储,仅完成最少的工作即可完成目标。 此练习主要是为了了解建立这样一个环境的可行性。 最终项目可以在这里找到:https://github.com/dimitryz/Notes 背景 对服务器/客户端应用程序进行编程存在一个共同的挑战,那就是跨多种平台和语言共享业务逻辑。 在撰写本文时,分布最广泛的语言也恰好是最不可能的:Javascript。 它曾经由Netscape在几周内开发出来,用于浏览器端编程,但是近年来,随着React Native和Node.js的引入,它可以在本机应用程序和服务器上找到。 JavaScript缺乏的东西是大多数非类型化语言所共有的: 它不如其他语言表现出色 可以说,阅读他人的代码更加困难 它提供较少的漏洞防护措施 对于希望提供服务器端逻辑来卸载其应用程序中嵌入的某些功能的iOS开发人员,还有另一种选择,而所有这些都使学习和技术负担降至最低。 迅速 随着Swift的推出,Apple使得iPhone和Mac开发人员可以使用与Apple硬件相同的语言在服务器上进行开发。 使用C和C ++总是可以做到这一点,但是以这两种语言中的任何一种开发服务器端代码的困难都阻止了它的采用。 编写后,Swift服务器代码可以部署在Mac或Linux硬件上。 在撰写本文时,有许多Swift框架可促进应用程序服务器端组件的开发。 IBM的Kitura 完善 汽 泽沃 我为此实验选择的是Kitura。 我最熟悉Kitura,在此练习中,它没有比其他框架明显的缺点。 初始设置 计划的文件/项目结构如下: Xcode工作区 > iPhone App项目 >服务器应用程序项目 >共享业务逻辑项目 >豆荚项目 我们通过创建顶层目录并向其中添加Xcode工作区来启动项目。 mkdir注意 cd笔记 接下来,我们创建一个新的NotesApp项目并将其添加到工作区中 我们不需要CoreData,从单个NotesApp项目中删除Git很重要。 我将根工作区目录初始化为git项目。 添加可可足 我还希望将Cocoapods附加到NotesApp项目(而不是其他项目)。 Podfile我们将Podfile文件添加到具有以下内容的根目录中。 工作区“ Notes.xcworkspace” 目标“ NotesApp” use_frameworks! […]
在上一篇文章中,我们介绍了类型转换,安全展开可选内容和访问控件。 Swift编程第8部分开始-类型转换,安全解压缩可选项和访问控制 在上一篇文章中,我们讨论了初始化,反初始化,覆盖和引用计数。 medium.com 没什么困难,对于您中的某些人而言,也许最好不过是适度的,因为有了访问控制的概念。 这篇文章可能会使事情再次升温,但这又仅仅是因为实际的应用程序用例。 我将尽力以一种可以帮助您理解所有内容以及何时应在何处使用所涉及的主题的方式来解释事情。 我知道有些教程可以直接跳转并提供扩展,但是我不会。 扩展是利用您已经知道的内容做更多事情的基础,因此,我决定最好从协议开始。 因此,让我们深入。 好的,所以协议和扩展声音令人生畏,Apple提供的定义在您开始时并不能消除浑水。 这个定义直接来自苹果的书: 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 你们中有些人可能已经了解到,其他人可能仍然会挠头。 不用担心,现在,让我们暂时忘记该定义,我有一个使用棒球的指导来指导我们进行定义。 在棒球中,我们有不同的位置,例如击球手,投手,接球手,垒手,外野手,教练和裁判员。 如果您对棒球有任何了解,您就会知道团队中的每个人都有自己的角色,每个人都擅长于该角色。 我们不能只是让三垒手成为投手,或者让裁判成为外野手。 第一种情况很难,因为团队喜欢为一垒手雇用左撇子,为三垒手雇用右撇子。 另一个似乎不是一个好主意,因为两队之间的裁判是中立的。 如果每个玩家都是一堂课, 那么他们如何玩游戏就由协议定义。 让我们看看它在代码中的外观。 扩展以简单的概念而得名。 扩展实质上是将功能扩展到类,结构或协议。 关于它们的使用方式,我将引用Swift中的Foundation库。 Foundation有一个名为UITableView的类。 UITableView本身仅处理显示表视图。 但是,我们可以通过给它一个名为UITableViewDataSource的扩展来扩展其功能。 这为采用此协议的类提供了提供数据如何在表视图内部显示的上下文的能力。 上图是扩展的一个很好的例子。 通过单击“无选择”,您可以打开当前布局的树。 这使您可以通过单击树的任何部分来浏览代码,Xcode将专注于该代码。 通过使用//MARK: — Properties ,可以在属性上方创建一条水平线,同样可以使用 //MARK: Properties —在属性下方放置一条水平线。 或者,您可以在上方和下方都设置一个,但是我通常只在上方放置一个,以将其分成这样的部分。 您可以选择最有意义的选项。 有关更多信息,请查看Apple的标记文档。 好的,只是我想离开这里的提示,回到扩展。 除了将您的代码分成逻辑区域外,它们还做了其他一些事情,这也成为我成为协议狂热者的原因,并尽可能尝试使用它们。 因此,协议对于团队来说很棒,从一开始就显而易见,但是您可能会问自己,如果您是一个单独的开发人员,为什么还要使用协议? 您知道一切都会做什么,并且不介意在一年后回到您的代码以发布更新时重新学习。 特别是如果这意味着必须编写更多的代码,这对于您的应用正常运行并不重要。 还记得Fielder协议吗? 如果我告诉您不必编写协议要求,也不必单击红色的停止符号以使它在每次使用协议的情况下都实现每个方法存根,该怎么办。 那您想要协议吗? 纯粹的事实是,在上面的示例中,如果您在同一实现中使用darn编写7次6个属性和4个方法,那将是疯狂的,那就是42个属性和28个方法,更不用说每种方法所涉及的逻辑了。 对我来说听起来像是折磨。 […]
让我们创建另一个名为Hasura.swift类 它将充当我们的离线存储,用于存储用户的authtoken和hasuraId 。 这将用于检查用户是否在应用启动时登录,并验证我们随后的API调用。 注意:为了更好地了解 Hasura auth的工作方式。 请检查 文档 。 2. Embed其Embed UINavigationController 。 给此UINavigationController一个Storyboard ID “ TodoNavigationController”(此标识符在AuthorizationViewController用于导航到TodoViewController ) UIBarButtonItems在TodoViewController两个UIBarButtonItems ,一个用于注销 ,另一个用于添加ANewTodo 4.添加一个Basic样式的Prototype Cell 带有Identifier “ todoCell ”的UITableView 。 在为UIBarButtonItems添加动作之后,我们的TodoViewController.swift应该如下所示: 在上面的代码中,当用户要注销时,我们还将显示警报,而当用户要添加新的待办事项时,将显示文本字段警报,询问待办事项的标题。 接下来,让我们创建一个模型对象,该模型对象代表在todo表(我们通过Hasura控制台创建)中创建的每个条目。 让我们称之为TodoRecord : Hasura上的数据API通过将查询发布到以下端点来工作: https:// data。 .hasura-app.io / v1 / query 注意:请仔细阅读 文档 以获得更好的理解。 TodoViewController需要进行5个api调用: 提取用户的所有待办事项: 该API如下所示: POST 数据。 .hasura-app.io / v1 / query […]
作为有抱负的iOS开发人员,服务器端编程并不是我要深入研究的主题之首。 但是,研究母语的多功能性和潜力激发了我的灵感,激发了我的创造力。 为什么iOS开发人员会考虑在服务器端进行编程? 为您的iOS应用创建自己的后端,而不是使用第三方 在您的网站上展示完整的应用程序,作为您产品组合的一部分 轻松管理您的内存占用量 使用客户端和服务器组件丰富您的项目 主要玩家 这里有三种出色的服务器端Swift服务:Perfect,Kitura和Vapor。 对于本教程,在创作者Tanner Nelson在Meetup上介绍了框架之后,我决定使用Vapor。 “ Vapor是用于开发基于云的应用程序的模块化服务器端框架,它利用Swift中的类型安全性,并提供模式匹配以简化路由。 该框架的共同开发者Logan Wright看到了Swift在服务器上的潜力,因为它已经可以容纳iOS开发人员,并且可以在不同平台之间实现代码共享。” -http://www.infoworld.com/article/3088305/application-development/server-side-developers-take-a-shine-to-swift.html 我该如何开始? 首先,请确保已安装Xcode 8,因为Vapor需要Swift 3。 由于Vapor使用命令行,因此请在Xcode中选择当前命令行工具。 导航到Xcode->“偏好设置”菜单中的“位置”。 这样我们就可以使用终端来构建和运行我们的代码。 在“命令行工具”下拉菜单中选择最新版本。 Vapor提供了一个命令行工具集。 首先运行以下命令,以确保您具有正确版本的Xcode和Swift: curl -sL check.vapor.sh | 重击 如果是这样,您应该获得一个绿色的复选标记。 如果没有,您将需要更新。 Swiftenv是一个很好的版本管理器。 一旦拥有正确的版本并且兼容性检查返回true,就可以安全地安装Vapor Toolset: curl -sL工具箱.vapor.sh | 重击 对我来说,安装非常快。 安装完成后,我通过在终端中键入“ vapor”来检查一切是否正常。 由于未执行命令,因此收到命令列表和错误。 现在剩下的就是创建一个项目和代码。 要创建一个新项目,只需导航到您要存储该项目的目录并运行以下命令(“ HelloWorld”是我的项目的名称。您可以在其中使用任何内容): $蒸气新的HelloWorld Vapor在当前目录中创建一个项目,并使用Swift Package Manager下载并安装所有必要的依赖项。 导航到您的项目目录。 Vapor安装的文件遵循“模型”,“视图”,“控制器”模式,每个都有一个文件夹。 对于此项目,我们将需要导航到并打开将首先运行Vapor的“ main.swift”文件。 […]
在Flickr上创建帐户后,您必须生成api密钥并将该api密钥替换为搜索URL中的“ ”。 由于这不是有关Flickr服务的教程,因此我们将不再赘述。 搜索Flickr之前,需要输入API密钥。 与Flickr api调用和图像数据相关的类已经创建并包含在项目中,该项目的链接在本教程的最后提供。 在本教程中无法编写和解释整个代码,请参考所有代码片段以从项目中提供的类中获得详细的了解。 该项目包包含两个类和一个专用于执行基于Flickr的任务的结构: FlickrSearchResults :一种结构,用于包装搜索词和为该搜索找到的结果。 FlickrPhoto :从Flickr检索的照片的数据模型-其元数据信息,例如其ID。 还有一种构建Flickr URL和一些大小计算的方法。 FlickrSearchResults包含这些对象的数组。 Flickr :提供一个简单的基于块的API来执行搜索并返回FlickrSearchResult 随意看一下代码-这很简单,可能会激发您在自己的项目中使用Flickr! 打开Flickr.swift并将apiKey的值替换为apiKey获得的API密钥。 它看起来应该像这样: 当您准备好开始时,请转到下一部分-是时候进行一些准备工作,然后再熟悉Flickr。 准备图像数据 打开SearchViewController.swift ,您将在其中找到两个属性: var searchs = [FlickrSearchResults]() 让 flickr = Flickr() searches是一个数组,将跟踪应用程序中进行的所有搜索,而flickr是对将为您进行搜索的对象的引用。 创建图像下载管理器 ImageDownloadManager类将创建一个单例实例,并具有NSCache实例来缓存已下载的图像。
在Xcode中,当您创建一个新的单视图项目时,您马上就可以在项目文件夹中找到一些文件。 这些是构建项目的良好起点-您可以将它们视为开箱即用运行项目所需的基本代码模板。 当然,如果您运行,则只会看到白屏。 让我们仔细看看AppDelegate.swift并查看该文件中发生了什么,以便我们了解它的作用以及为什么需要它。 我们看到的第一件事是我们正在导入UIKit框架。 Apple文档可以为我们提供有关框架功能的更多信息: 构建和管理适用于iOS和tvOS的应用程序的用户界面。 响应用户交互和系统事件,访问各种设备功能,启用辅助功能,并使用动画,文本和图像。 在watchOS应用中,启用辅助功能并使用字体和图像。 通过看到这已导入-我们知道AppDelegate类需要与用户界面建立某种连接。 @UIApplicationMain 接下来是“ @UIApplicationMain ”。 这是怎么回事? 尽管在上一行中,但它实际上是AppDelegate类声明的一部分。 它称为属性。 将此属性应用于类以指示它是应用程序委托。 使用此属性等效于调用UIApplicationMain函数并将此类的名称作为委托类的名称传递。 这就是说,您可以将此属性用作在自定义类上调用UIApplicationMain函数的简写。 那该功能做什么呢? 在main入口点调用此函数以创建应用程序对象和应用程序委托并设置事件周期。 在运行应用程序时,它需要知道从哪里开始执行代码。 可可触摸在UIApplicationDelegate的实现上使用@UIApplicationMain属性而不是main.swift文件来标记入口点。 由于在采用UIApplicationDelegate协议的AppDelegate上调用了“ @UIApplicationMain ”,这意味着AppDelegate充当了该应用程序的主要入口点。 现在,该应用程序知道从哪里开始,它创建的是UIApplication类型的单例 。 单例为在iOS中运行的应用程序提供了集中的控制和协调点。 然后,您的自定义类(AppDelegate)成为该UIApplication单例的委托 。 这个名字开始变得有意义了…… 类声明 现在让我们看一下AppDelegate类的其余声明。 我们可以看到它是UIResponder的子类,并且采用了UIApplicationDelegate协议。 让我们看看赋予类的功能是什么…… 首先让我们看一下UIResponder。 UIResponder类为响应和处理事件的对象定义一个接口。 它是UIApplication , UIView及其子类(包括UIWindow )的超类。 这些类的实例有时称为响应者对象,或简称为响应者。 一般有两种事件:触摸事件和运动事件。 触摸的主要事件处理方法是touchesBegan(_:with:) , touchesMoved(_:with:) , touchesEnded(_:with:)和touchesCancelled(_:with:) 。 这些方法的参数将触摸与其事件相关联(尤其是新的或已更改的触摸),因此,当所传递的事件在多点触摸序列的各个阶段中进行时,响应对象可以跟踪和处理这些触摸。 每当手指触摸屏幕,在屏幕上拖动或从屏幕抬起时, UIEvent生成UIEvent对象。 事件对象包含针对屏幕上所有手指或从屏幕上抬起的所有手指的UITouch对象。 […]
窗口— Helloอของที่เราทำไว้ครั้งที่แล้วา您好,TouchBar…แต่ที่เพิ่มว่าคือ其他项目 视图控制器Contentน内容视图控制器ขอข窗口จะมีTouchBarอีกอันเป็นของตัวเองซึ่งจะมีปุ่ม2ปุ่มกับLabel 1อันเพื่อทำเป็นCounter 其他项目—ตัวBar Bar Bar Bar edืืืposed Touch Touch Touch Touch NSTouchBarItem Touch Touch Touch Touch ItemหหBar Item Item Bar Touch Bar Bar Res Res Res Resั้Res Barาตัวต่อามาใส่ตรงนั้นให้แต่ถ้าไม่มีระบบจะเอาTouchBarตัวต่อไปมาใส่แทนเลย (พูดง่ายProxyตัวอถ้าไม่ใส่otherItemsProxyตัว您好,TouchBarของ窗口จะโดน替换ด้วยTouchBarของView Controllerเลยนั้นเอง) รายละเอียดเพิ่มเติมอ่านได้จากลิ้งค์ได้ล่าง NSTouchBar 在受支持的MacBook Pro型号上,键盘上方的触摸栏显示了来自… developer.apple.com 的NSTouchBar类的实例。 otherริ่มแก้โค็ดอันเก่าของเราโดยการเพิ่ม。otherItemProxyไปในWindowController.swift 柜台ใคนให้ลงไปดูล่างสุด 4.ใส่计数器ให้กับ视图ในViewController TouchนในTouchBar在Barากดในตัวเลขใอแเพิ่มด้วยไปด้วอTouch Touchยนไปด้วย中 ใส่LabelไปใาไปในViewของViewControllerในIBแล้วก็bindมันซะก็จบละ จบแล้ว…สำหรับ源代码ดูได้ในGithubใน分支机构计数器 n3tr / CounterTouchBar 通过在GitHub上创建一个帐户为CounterTouchBar开发做出贡献。 github.com Dribbble API应用商店NSScrubber TouchBarไม่ขึ้น,标签Labelใส่แล้วาใส่แล้วTouchBarขViewControllerหายไป เกิดาเกิดTouchBarของViewControllerที่เราสร้างไม่แสดงซึ่งผมก็เจอปัญหานี้เหมือนกันโดยกรณีที่ผมเจอคือ makeTouchBarแล้วใช้ได้ […]
我正在学习ARKit。 只是想我愿意分享我在其中一种练习或练习中遇到的情况。 我想做什么? 因此,关于我要完成的工作的一些背景信息。 从大图看,一旦应用启动,便已经存在一个3D白色块。 我想要做的是能够在任何平坦的表面上轻拍,并在该位置渲染或生成另一个盒子。 点击3D块,然后使该块消失。 所以,我有2个街区,对不对? 还有更多,随着我的探索。 这是逻辑代码 让我解释。 首先,我们进行一次命中测试。 如果有一个节点,或者我们实际点击了3D块,则返回该节点并将其从父节点中删除。 这摆脱了屏幕上的节点。 但是,如果我们未点击3D块,则进入if语句。 从第一条语句中,您可以看到我实际上是在尝试找出我所利用的是否是特征点(也称为平面)或Apple文档定义中的任何现实对象。 如果碰巧是一个功能点,我将调用addBox()方法。 这将添加另一个3D块。 运行该应用程序时会发生什么? 因此,我运行了该应用程序。 在平坦的表面上轻按,然后发生了什么,在该表面上渲染了一个块,但是原始块消失了。 不应该发生。 调试时间 因此,我想出如果我尝试使用常规的if-else语句,我会清楚地看到事情,因为我所做的只是一个警卫语句,只是Swift风格的另一个if语句。 所以我尝试了这个。 以不同的方式做同样的事情。 我运行了该应用程序,发生了同样的事情,这很奇怪。 两种代码都做同样的事情。 我检查了Apple的文档,并且非常确信它应该按照我认为的方式去做。 但事实并非如此。 因此,我认为我将检查代码的其他部分。 addBox()方法怎么样? 构建盒子和其他东西之后,这就是代码。 该代码的作用是每次调用addBox()时addBox()初始化一个新场景,并将该场景设置为视图的场景。 如果它每次都设置一个新场景,则意味着在调用该方法后,所有内容都将重置。 因此,每次我在平坦的表面上轻拍时,都会初始化一个新场景并添加一个块。 这可能就是为什么事情没有按计划进行的原因。 所以我将代码更改为此。 这是在现有视图的场景上添加一个块。 因此,它不会每次都重置,而只是添加一个块。 无论如何,这是我试图发表更清晰的技术文章。 希望你能理解。 谢谢阅读!
快速切换案例很有趣,这有很多原因。 首先,如果您是Obj-C开发人员,那么能够在字符串和除整数以外的任何类型上使用切换用例的功能就足够有趣了。 这是一个非常正常的简单开关案例,它使用字符串名称来标识它的主服务器。 但这还不止于此,swift的模式匹配使它变得更加有趣。 输入模式匹配,事情变得更加有趣。 现在,如果切换案例精通是一个合并规则,那么如果我不能独自声明标题,那我的伙伴也必须在那里同时将双键翻转在一起。 为了解决这个问题,我们可以匹配一个元组。 在这里,我们将一个具有两个名称的元组匹配,但是如果这种伙伴关系稍微放松一点,并且只要您中至少有一个存在,您就可以与任何想要的人一起去呢? 您始终可以忽略元组中的值,而仅检查一个名称。 在某些情况下,您可能并不关心匹配元组的一部分,但是您仍然需要知道其值。 在这种情况下,您可以在元组的该部分之前使用“ let”。 带有模式匹配的切换案例在很多情况下都可以使用,并且在很多情况下都可以使用,您会在许多流行的开源库的心脏中找到它,在Moya内找到它来命名。 在注释中命名带有切换用例和模式匹配的开放源代码,此外,如果您有任何其他情况,请提及它,我很乐意更新并添加该文章。