Tag: 教程

在iMessage中创建看起来像聊天气泡的聊天气泡-简单的方法

本文是有关创建(iMessage样式)聊天气泡的两篇文章的第一篇。 本文基于Rob Kerr的原始教程。 在本文中,我们将探讨创建带有尾巴的聊天气泡的简单方法。 在第二篇中,我们将介绍高级方法。 本教程是使用Swift 4.1和Xcode 9.2创建的。 源代码在Github上可用。 本教程将教您如何创建一个带有尾巴的聊天气泡,它看起来像是iMessage中的聊天气泡。 但这与创建一个成熟的聊天应用程序无关。 我将专门关注如何以简单的方式创建动态大小的气泡。 让我们开始吧! 我们的气泡将基于易于拉伸的图像 为了拉伸图像,我们将使用resizableImage(withCapInsets capInsets: UIEdgeInsets, resizingMode: UIImageResizingMode) -> UIImage UIImage实例的resizableImage(withCapInsets capInsets: UIEdgeInsets, resizingMode: UIImageResizingMode) -> UIImage方法 另外,我们将使用boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect String实例的boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : […]

RainCat:第4课

如何在Swift 3中制作一个简单的SpriteKit游戏 再一次问好! 如果您错过了上一课,可以在这里查看。 如果您没有第3课中的代码,当前可在GitHub上获得。 在上一课中,我们添加了大部分资产,最后使用zPosition属性正确定位了它们。 我们增加了猫的功能,以及在猫掉到屏幕上造成一定危险时重新生成猫的功能。 接下来,我们在屏幕上的任意位置生成食物,但是在屏幕的两侧都留有边距,因此不会太靠近屏幕边缘。 我们为这两个精灵添加了碰撞,并且只在用伞将猫推到那里时,猫才能够收集食物。 也就是说,直到今天! 在本课程中,我们将重点关注: 将猫移向食物 动画猫 遇雨会损坏猫 添加声音效果 添加音乐 获取您的资产! 今天的资产可在GitHub上找到。 就像之前三课中一样,将图像再次拖到Assets.xcassets中 。 稍后我们将添加声音效果和音乐。 让我们继续前进! 让我们的猫动起来并不难。 我们不会通过触摸屏幕来与猫互动,这是我们当前移动雨伞的方式。 相反,猫会根据食物的当前位置移动。 目前,我们的食物精灵已添加到场景中并被遗忘,但是每次调用更新时我们都需要知道食物的确切位置,以使猫指向正确的方向移动。 回到我们的GameScene.swift ,让我们在文件顶部的本地cat变量下面添加一个变量: 私人食品:FoodSprite! 然后,我们可以更新spawnFood函数以在每次生成食物时设置此变量。 在spawnFood函数中,替换为: 让食物= FoodSprite.newInstance() 与: 食物= FoodSprite.newInstance() 这会将food变量的范围从spawnFood函数更改为GameScene文件的范围。 现在,我们需要编辑CatSprite文件,以了解它朝食物移动的方向。 要获得食物,我们需要知道我们可以朝着什么速度前进。 在CatSprite.swift文件的顶部,我们可以在newInstance函数上方添加以下代码行。 私人让步速度:CGFloat = 100 这条线是我们的移动速度,它是对非常复杂的问题的非常简单的解决方案。 我们在这里仅使用一个简单的线性方程,而忽略了摩擦或加速度会带来的任何复杂性。 现在,我们需要使用update(deltaTime 🙂方法做一些事情。 因为我们将知道食物在哪里,所以我们需要朝该位置移动。 用以下代码替换CatSprite.swift中的更新函数: 接下来,我们可以添加行走动画! 之后,我们将向后转圈以修复猫受到打击后的旋转。 您可能已经注意到,有一个名为“ cat_two”的未使用资产。 我们需要拉动该纹理并将其交换出去,以使其看起来就像猫在走路。 为此,我们将添加第一个SKAction! […]

学习软件的艰辛方式…或在此过程中要使用的一些技巧

我又来了 如所承诺的,我将写关于iOS编程的第一步以及为什么我仍处于起步阶段。 首先,在35岁时,我正在尝试新事物,而不是因为体内缺乏肾上腺素。 我住在俄罗斯莫斯科,是土耳其语翻译。 但是由于叙利亚战争和ISIS的所有问题,俄土关系出现了巨大下降。 因此,我几乎失去了我的整个职业。 我一直对应用程序的开发和设计感到好奇,因此,时间和政治问题才是推动我前进的原因。 当然,这也是一个选择。 YouTube和其他网站上有大量不错的免费教程和资料。 但是其中之一,可以选择付费课程。 我也是。在网上搜索免费内容的同时,我还购买了一些付费教程。 我不会在这里列出它们,因为没有必要。 我把适当的反馈留在了原本应该的地方。 对于进一步的提升和建议,我将在以后的某个时间发表另一篇文章。 诺言。 后来我知道,我的方法是完全错误的。 这就是为什么:我通过阅读文章和扫描带有代码示例的教程,重复和重写它来开始学习Swift编程语言和iOS开发。但是我从来没有实现我在自己的项目中学到的东西。 实际上,那时没有“我自己的项目”之类的东西。 所以我退后一步,考虑了整个情况。 简而言之,我只是复制粘贴代码,然后将其保留在那里,实际上我在几天之内就忘记了之前学到的东西。 对每个API和UI元素一次又一次地这样做是没有意义的。 当然,我刻苦和无用的学习的另一个原因是,我对于这个行业来说已经很老了,而且比心脏病发作还年轻。 然后,我做出了一个决定,只学习那些将对解决那些在那个特定时刻困扰我的特定问题有用的东西。 但是首先,我需要自己的项目。 我可以使用的真实应用程序。 我看了一些教程,并从不同的应用程序和教程中汲取了一些想法(偷:),我想到了一个开关的想法,它将能够打开和关闭,发出声音并在特定时间后切换功能会更改背景色和带有令人鼓舞的短语的标签。 而已。 没有花哨的东西。 没有数英里的代码。 只是iPhone的一种烦躁类型。 我找到了开关图像,并使用Sketch绘制了它们。 使用该图像创建了一个简单的应用程序图标。 并开始编码。 为此,我学习了如何在打开开关时添加声音,如何更改UIImageView的图像以及如何更改背景。 就像那样,逐个问题地提出了我的第一个简单但我自己的iOS应用程序。 这是我对那些新手和新生的建议。 不要将时间浪费在仅仅学习基础知识上。 只是想出主意,无论它多么疯狂或显而易见。 然后尝试通过克服障碍并解决问题来制作该应用。 逐一。 一步步。 今天就这样! 有一个很好的尝试和错误。 问题越难解决,满意度就越高!

在iMessage中创建看起来像聊天气泡的聊天气泡-高级方式

本文是有关创建(iMessage样式)聊天气泡的两篇文章的第二篇。 第一篇文章在这里可用。 在本教程中,我们将介绍创建带有尾巴的聊天气泡的高级方法。 本教程是使用Swift 4.1和Xcode 9.2创建的。 源代码在Github上可用。 本教程将教您如何创建带有尾巴的聊天气泡,看起来像iMessage中的聊天气泡。 但是本文不是关于创建一个成熟的聊天应用程序的。 我将专注于如何以高级方式创建动态大小的气泡。 开始吧! 我们将创建一个UIBezierPath实例,它看起来像一个聊天气泡 并根据我们内容的大小调整此路径的大小 我们将使用boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect String实例的boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect方法来计算文本内容的boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey […]

教程:如何在iOS应用中对私有方法进行单元测试

在之前的文章中,我提到了一种为私有方法编写单元测试的方法。 你们中的许多人对此可能性感兴趣,并想了解更多。 我认为这将有助于为您提供一个可以遵循的教程,因此请继续。 如果您回想起上一篇文章,我说过微框架是解决此问题的一种方法。 什么是微框架? 没什么特别的,只是导入到主应用程序目标中的一个小框架。 为什么这样做 任何具有内部访问级别的内容都可以在其测试模块的单元测试目标中访问。 然后,将相同的框架导入到主应用程序目标后, 内部实体将无法访问,或者出于所有实际目的变为私有。 如果所有这些听起来像胡言乱语,请不要担心。 让我们通过一个小教程逐步完成它。 入门 继续并从Github获取入门项目。 这里没有什么特别的事情,它只是一个空的单视图应用程序。 由于这是一个有关微框架的教程,因此,我们转到File-> New-> Target来创建一个新框架。 框架是一种目标。 它是一个代码模块,可以导入到另一个标记中,例如您的主应用程序的目标。 停留在iOS上,并一直向下滚动。 选择“ Cocoa Touch Framework”,然后单击下一步。 您将被带到另一个屏幕,您可以在其中命名您的自定义框架。 遵循Apple的命名约定,我选择将其命名为CoreTrick。 选中包含单元测试复选框非常重要。 这就是让您为要导入的框架编写单元测试的原因。 单击“完成”,然后在您的项目上单击以再次检查一切是否正常。 如果遵循正确,您将看到一个应用程序目标,一个应用程序目标的单元测试目标,一个框架目标以及该框架目标的另一个单元测试目标。 TrickTrackerTests是TrickTracker的单元测试目标,TrickTracker是主要的应用程序目标。 CoreTrickTests是CoreTrick的单元测试目标,CoreTrick是框架目标,它将包含您要测试的所有实体。 大! 您已经准备好开始编写一些代码。 让我们创建一些内部实体并对其进行测试 通过内部 , 我只是指与他们相关的访问级别。 函数,变量,类,枚举和结构都可以标记为internal 。 这仅表示这些实体只能在定义它们的模块内访问。 在这种情况下,那就是CoreTrick框架。 我确定您还熟悉其他访问级别。 Public表示可以在模块外部访问实体。 打开意味着它可以在模块外部访问,并且可以被子类覆盖。 私有意味着只能在实体本身的范围内访问它。 单板滑雪特技动作实体 我们的Snowboard Trick Tracker应用程序可跟踪您的滑雪技巧(phe们说快了五倍!)。 它使用具有一些基本属性的简单Snowboard Jump Trick实体。 创建一个名为SnowboardJumpTrick的新Swift文件,并将以下代码粘贴到其中。 […]

XCode故事板简介

我们也有Launchscreen.storyboard,但是现在我们只需要Main。 默认情况下,Main.storyboard包含显示该屏幕的屏幕,然后您首先启动模拟器。 故事板是一种文件类型,用于以图形方式使用界面。 您也可以通过代码进行接口。 情节提要是界面构建者的一种工作方式。 现在,您会看到IB的窗口。 故事板是一个XML文件。 如果转到Navigator-> Main.storyboard->右键单击-> Open As源代码中的文件,则可以看到XML代码。 您将看到XML代码。 场景/视图控制器/视图等。 通常,我们不会使用XML。 因此,让我们回到IB模式。 导航器-> Main.storyboard->右键单击->打开为界面生成器。 默认情况下,您会看到一个空白屏幕。 它是一个视图控制器。 iOS应用程序中的每个新屏幕都是一个视图控制器。 我现在想向SB添加其他组件。 我们需要去对象的图书馆。 您可以在右上角找到。 图标在圆圈内为正方形。 单击它之后,您将看到对象。 让我们跳过所有黄色对象。 它们用于创建新的屏幕,我们目前不需要它们。 您可以滚动列表,然后看到其他对象。 目前,您可以使用背景上没有正方形的所有内容。 带有正方形的对象用于容器。 您可以使用ImageView,TextView和“从容器查看”。 添加您喜欢的所有对象并运行模拟器。 如果添加任何容器,您将不会在模拟器中看到它。 您可以在窗口菜单中将模拟器视图从实际视图切换到仅屏幕视图。 确保要运行的设备(1)和Interface Builder视图相同。 只需添加我之前提到的任何对象,然后尝试运行您的应用程序即可。 这是您的第一个用户界面。

iOS中整个应用程序中的“后退按钮事件”

但是,因为我们在Objective-C中使用类别向基类添加自定义方法,以使代码更短并使性能保持原样。 同样,我们可以在Swift中添加常见的IBOutlet和IBAction,这也将反映在情节提要或XIB的“连接检查器面板”中。 为此,我们必须创建一个空白的swift文件。 在Swift中,文件名并不重要,这与在Objective-C中进行“类别”时必须提供特定的文件名不同。 检查以下屏幕截图。 我创建了一个名为’Extensions.swift’的Swift文件,并在’UIViewController’扩展名中使用’IBAction’写回了按钮事件。 现在,您可以在情节提要ViewController及其各自的连接检查器中查看效果。 即使在特定类中对“ backPress”事件进行注释后,情节提要仍在接受backpress方法。 它来自扩展文件。 现在,您可以通过此操作映射后退按钮,并且可以得到相同的结果。 您无需在所有类中都编写backpress事件。 如您在“ Extensions.swift”类屏幕截图中所见,还有一个条件可以区分是显示还是推送。 因此,动作将自行决定要执行的操作,是关闭还是弹出viewcontroller。 有关使用Swift或Objective-C开发iOS的任何疑问,请立即与我们联系。 联系与应用 从以下链接下载此示例的完整源代码:http://bit.ly/iOS_AndApps_01

实现RxSwift与Swift委托

委托是一种常用的设计模式,它允许一个对象通过协议将工作移交给另一个对象(可能是不同类型)。 另一方面, 反应式编程围绕应用程序生态系统中变化的扩散而进行的数据流和传输。 这是通过观察者,可观察对象和调度程序完成的,观察者在调度程序告诉它们运行的​​线程上寻找可观察对象的发射。 James Rochabrun的文章“在Swift中逐步实现委托”是我阅读的关于委托的第一篇文章之一。 这是一个使用两个视图控制器A和B的简单应用程序。视图控制器A符合视图控制器B的委托协议,其中视图控制器B告诉A显示用户选择的颜色。 我将使用James的委托示例与使用响应式编程(RxSwift)的相同实现进行比较。 // 1 覆盖func prepare(对于segue:UIStoryboardSegue,发件人:任何?){如果让nav = segue.destination为? UINavigationController,让viewControllerB = nav.topViewController为? ViewControllerB {// 2 viewControllerB.delegate = self}} // 3 func changeBackgroundColor(_ color:UIColor?){view.backgroundColor = color} 此代码块在ViewControllerA.swift 。 //1当用户单击“显示视图控制器B”时,将调用该代码以准备该序列。 //2由于在此代码块中有对ViewControllerB的引用,因此我们将B的委托变量分配给self ,即ViewControllerA 。 协议ViewControllerBDelegate:类{ func changeBackgroundColor(_ color:UIColor?)} 接下来,在ViewControllerB.swift文件中,声明ViewControllerB.swift的协议,该协议包含更改View Controller A中背景颜色的功能。 // 1 弱var委托:ViewControllerBDelegate?// 2 @objc func handleTap(_ tapGesture:UITapGestureRecognizer){// 3 view.backgroundColor = tapGesture.view?.backgroundColor […]

如何在Swift中构建QR Code Scanner App

那么,什么是QR码? 我相信大多数人都知道QR码是什么。 如果您还没有听说过,请看一下上面的图片-这是一个QR码。 QR(快速响应的缩写)代码是由电装公司开发的一种二维条形码。 QR码最初是为跟踪制造中的零件而设计的,近年来,它已在消费者空间中流行,作为一种编码着陆页URL或营销信息的方式。 与您熟悉的基本条形码不同,QR码包含水平和垂直方向的信息。 因此,这有助于其以数字和字母形式存储大量数据的能力。 我不想在这里进入QR码的技术细节。 如果您想了解更多信息,可以访问QR码的官方网站。 随着iPhone和Android手机的普及,QR码的使用已大大增加。 在某些国家/地区,QR码几乎可以找到。 它们出现在杂志,报纸,广告,广告牌,名片甚至食物菜单中。 作为iOS开发人员,您可能想知道如何才能让您的应用程序读取QR码。 在iOS 7之前,您必须依靠第三方库来实现扫描功能。 现在,您可以使用内置的AVFoundation框架实时发现和读取条形码。 创建用于扫描和翻译QR码的应用从未如此简单。 快速提示:您可以生成自己的QR码。 只需访问http://www.qrcode-monkey.com 我们将要构建的演示应用程序非常简单明了。 但是,在继续构建演示应用程序之前,必须了解iOS中的任何条形码扫描(包括QR码扫描)完全基于视频捕获,这一点很重要。 这就是在AVFoundation框架中添加条形码扫描功能的原因。 请记住这一点,因为它将帮助您理解整个章节。 那么,演示应用程序如何工作? 看看下面的截图。 这是应用程序用户界面的外观。 该应用程序的工作原理与视频捕获应用程序非常相似,但是没有录制功能。 启动该应用程序后,它将利用iPhone的后置摄像头来识别QR码并自动对其进行识别。 解码信息(例如URL)显示在屏幕底部。 就这么简单。 要构建该应用程序,您可以从http://www.appcoda.com/resources/swift42/QRCodeReaderStarter.zip下载项目模板开始。 我已经预先构建了情节提要,并为您链接了消息标签。 主屏幕与QRCodeViewController类相关联,而扫描仪屏幕与QRScannerController类相关联。 您可以运行入门项目来看看。 启动应用程序后,您可以点击“扫描”按钮以调出扫描视图。 稍后,我们将实现此视图控制器以进行QR码扫描。 现在您已经了解了入门项目的工作原理,让我们开始并在应用程序中开发QR扫描功能。 我已经在项目模板中创建了该应用程序的用户界面。 UI中的标签用于显示QR码的解码信息,并且与QRScannerController类的messageLabel属性关联。 如前所述,我们依靠AVFoundation框架来实现QR码扫描功能。 首先,打开QRScannerController.swift文件并导入框架: 完成编辑后,请部署应用程序并再次在真实设备上运行它。 轻按扫描按钮应调出内置相机并开始捕获视频。 但是,此时,消息标签和顶部栏已隐藏。 您可以通过添加以下代码行来修复它。 这将移动消息标签和顶部栏,使其显示在视频层的顶部。 启动后,点击扫描按钮,然后将设备指向图11.4中的QR码。 该应用程序立即检测到代码并解码信息。 本文首次发布在AppCoda.com上,是《 iOS 12使用Swift编程》一书的示例章节。 在社交媒体平台上关注我们: 面子书:facebook.com/AppCodamobile/ Twitter:twitter.com/AppCodaMobile Instagram的:instagram.com/AppCodadotcom […]

如何记录您的iPhone屏幕

Quicktime>新电影录制>将源更改为iPhone 我已经被问过几次这个问题,所以我最终决定写下我的答案。 这很容易。 只需将手机插入Mac(必须将其插入,因此无需无线录音) 打开Quicktime,然后选择“文件”>“新电影录制” “记录”按钮旁边有一个白色的下拉箭头。 选择您的iPhone,它将刷新窗口并显示您的实时iPhone屏幕。 单击录制开始录制。 完成后,请确保以1080p导出。 如果您是视觉学习者,我就录制了一段简短的视频。