Tag: iOS应用程序开发

使用UIMotionEffect创建视差效果

我敢肯定,您之前在设备主屏幕以及其他应用程序(如消息,天气和Facebook Paper)上已经看到了这种酷炫的效果。 iOS使用视差效果在主屏幕和设备其他区域上产生深度感。 在本教程中,我们将讨论运动效果,这是一种将设备的真实属性映射到应用程序界面并在设备水平和垂直倾斜时影响界面外观的简便方法。 什么是UIMotionEffect? UIMotionEffect是iOS 7中引入的抽象类,用于向用户界面添加逼真感。 将UIMotionEffect视为类似于CAAnimation的类,它们都分别为连接到它们的Views和Layers设置动画。 除了CAAnimation是时间的函数而UIMotionEffect是设备的运动的函数之外。 UIInterpolatingMotionEffect是负责将这些效果添加到视图中的类。 创建此类的新实例后,必须将适当的值分配给minimumRelativeValue和maximumRelativeValue属性。 当用户移动设备时,运动效果开始将系统返回的固定偏移值转换为指定的值范围。 建立您的Xcode专案 让我们开始使用Xcode创建一个新项目,然后选择Single View Application作为模板,并将其命名为Parallax Effect 。 我们将在这个项目中使用Swift作为编程语言,因此在创建项目时不要忘记选择它。 完成后,在Project Navigator中选择Main.storyboard ,然后将Image View对象从Object Library拖到View Controller。 下载此图像并将其图像更改为该图像 (或所需的任何图像)。 然后将其放在主视图的中心。 不要忘记将图像视图的“ 内容模式 ”设置为“ 居中 ” 。 使用Xcode 7.3,您必须为视图配置自动布局约束,以支持所有类型的iOS设备。 在最新版本的Xcode中,“自动布局”功能非常强大。 对于简单的约束,您只需单击“自动布局”菜单的“问题”选项,然后选择“添加缺少的约束” ,Xcode将自动为视图配置布局约束。 实现UIInterpolatingMotionEffect 现在,您已在情节提要板上创建了图像视图,是时候创建视差效果了。 打开ViewController.swift文件,并将以下代码添加到viewDidLoad 。 具有UIMotionEffect的视差效果 我见过许多开发人员使用keyPaths center.x和center.y实现此效果,我认为这不是通过在框外拉伸图像视图以告知视图控制器图像更大来解决此问题的正确方法。比显示的要多。 使用3D变换将是创建深度感知的正确方法,而无需那些黑客来实现我们的目标。 仅对垂直轴和水平轴使用关键路径layer.transform.translation.x和layer.transform.translation.y 。 创建完UIInterpolatingMotionEffect实例之后 ,正如我在本教程开始时所说的 ,我将为“垂直轴”和“水平轴”指定一个最小值和最大值。 最后,将运动效果添加到图像。 UIMotionEffectGroup类管理您希望同时应用的动作效果的集合,而不是单独添加它们。 而已! […]

教程:如何在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文件,并将以下代码粘贴到其中。 […]

iOS应用内购买tanımlama101

应用程序购买中的Uygulamanıza(UygulamaİçiSatınAlma)özelliğieklemekçokkolay。 TanımladığınıIAP’yi应用商店’daçıkmadanöncekolayca测试edebilirsiniz。 Ancakbazıadımlarıatlarsanız,测试ederkenbazıhatalar ilekarşılaşabilirsiniz。 Adımadımnasılyapılacağınabakalım。 甜菜 developer.apple.com” giriyoruz。 证书,标识符和配置文件altında应用程序ID的sekmesine giriyoruz。 Burada Uygulama ID’miziseçtiğimizde,应用服务的高级专员。 Bu Alanda IAP已“启用”olmalı。 “ Disabled” ise en alttaki编辑按钮。 iTunes连接 itunesconnect.apple.com’dauygulamamızıseçip,功能为altındaIAP ekliyoruz。 4个IAP变量: 1-耗材,kullanıldığındatekraralınmasıgereken IAP 2-非消耗性的,可再生的IAP 3-自动续订,belili bir periyodlasınırlıIAP,kullanıcıiptaletmedikçeotomatik yenilenir。 4-非续订订阅,otomatik yenilenmeyen IAP IAPtanımlarkenkafakarıştırannokta“产品ID”,但不提供IAP’nin id’siuygulamanızındeğil。 通用个人识别码IAPadıeklenerekoluşturulur,kullanımkolaylığıiçin。 Sizin id’niz tamamenfarklıbirşeyolabilir。 XCode整合 IAP’mizioluşturduktan声音IAP’yiuygulamamızaEntegre etmenin en kolay yolu SwiftStoreKitkütüphanesi。 bizz84 / SwiftyStoreKit SwiftyStoreKit –轻量级应用内购买iOS 8.0 +,tvOS […]

如何制作自己的iMessage贴纸包,无需编码

介绍 在最新的iOS 10中,Apple为第三方开发人员添加了一项名为iMessage apps的新功能。 使用它,开发人员可以制作自己的应用程序。 苹果在iTunes上添加了新的[iMessage应用]部分。 这仅与iMessage有关。 iMessage应用程序仅在iOS上可用,其内容仍将在macOS和watchOS设备上查看。 iMessage扩展名具有类似的功能,例如照片,键盘等扩展名。 唯一的区别是,iMessage App Store在Messages应用程序内部独立存在,您可以创建iMessage应用程序,而不必创建在用户主屏幕上运行的iOS应用程序。 基本贴纸包 对于只想创建快速简便的iMessage贴纸包的人,Xcode提供了一个模板,而无需编写任何代码! 这将是使完全没有编程知识的图形艺术家能够创建贴纸包的绝佳工具。 消息框架支持三种标签大小,这些大小显示在基于网格的浏览器中。 在“ Xcode属性”检查器中,您可以为贴纸包选择以下大小之一: 小。 100x 100点@ 3x(300 x 300像素)。 介质。 136 x 136点@ 3x(408 x 408像素)。 大。 206 x 206点@ 3x(618 x 618像素)。 为了获得最佳质量和性能,它会提供您选择的尺寸的贴纸图像。 但是,您可以在贴纸包中使用的图像有一些限制: 图片必须是PNG,APNG,GIF或JPEG文件。 该文件必须小于500 KB。 为了获得最佳结果,图像不应小于100 x 100点或大于206 x 206点。 注意 始终提供@ 3x图像(300 x 300像素至618 x 618像素)。 […]

IOS面试常见问题解答(2018年8月)第4部分

本文结束了本月的问题,下个月将有更多新问题。 Q1。 下面的代码片段是否正确并且不会产生编译器错误? 在B类中进行覆盖时,是否需要删除class关键字? 解决方案 : 是的,它是正确的并且可以正确编译,如果您在类B中的重写功能中删除了类关键字,则会抛出错误。 Q2。 在以下片段中,有两种情况 一种。 如果在func转换之前添加class关键字该怎么办呢?这意味着什么,它将进行编译? b。 如果在func转换之前添加static关键字该怎么办呢。这意味着什么,它将进行编译? 解决方案 : 一种。 它将给出编译时错误 b。 它将完美编译 下一个问题涵盖了什么意思。 Q3。 Swift中的静态函数和类函数有什么区别? 解决方案 :结构和枚举的静态函数,以及用于类的类 其他一些区别是类函数是动态调度的,并且可以被子类覆盖。 Q4。 什么是“仅类协议”,您可以为其编写代码吗? 解决方案 :通过将AnyObject协议添加到协议的继承列表中,可以将协议采用限制为类类型(而不是结构或枚举)。 Q4。 编写通用Singelton类? 解决方案:符合Initializable协议的类在整个生命周期中将只有一个实例。 用例: 希望你喜欢这个解释。 如有其他疑问,请访问-iOS专家系列或访谈系列 解决方案 :是否简单地将static用于结构和枚举,协议和类的静态函数? 那是主要的区别。 其他一些区别是类函数是动态调度的,并且可以被子类覆盖。

Swift中的反思还是仅仅是自省?

作为软件开发人员,我们对称为反射的概念非常了解,但是我们是否可以在iOS中轻松使用它,尤其是在Swift中? 反射被定义为计算机程序在运行时检查,自省和修改其自身的结构和行为的能力。 由于Swift是一种静态类型的语言,我们几乎不使用反射,但是自从Swift 2使用镜像结构以来,就可以使用反射的支持,但是它更像是iOS提供的自省功能,因为它仅允许我们查看对象的属性而不修改它们但我们无法访问计算的属性和方法,它也适用于类和结构的对象类型。 在Metatype ,每种Swift元数据类型都有Mirror实现: Tuple , Struct , Enum , Class , Metatype都从ReflectionMirrorImpl抽象类派生。 让我们采用一个名为Person的结构,它具有以下属性 并将Person的实例创建为– 那么使用struct Mirror并使用镜像中称为 child的属性,可以很容易地检查属性及其值。 每当我们遵守上述任何协议时,无论何时在结构或类中添加或删除属性时,都必须更改已实现的方法,这非常令人沮丧且容易出错,因为我们可能忘记了在一致性方法中对其进行更新。 因此,镜子来了我们的营救。 有一系列转储函数,它们通过使用给定项的镜像来组成给定项的文本表示形式。 该方法假设相等的对象始终具有相同的镜像。 在将其合并到生产代码中之前,请根据您的域模型评估此假设。 现在,我可以简单地在Person结构的两个实例上使用equatable运算符,而不必担心其中的修改。 注意 Mirror当前在Swift中处理类和结构的对象,为了在类型上进行处理,我们必须借助目标C运行时的帮助,这将是前几天的话题,但是本文将为您提供有关反射如何在Swift中工作。 Apple本身使用反射在调试器和游乐场中显示值,反射的两种可能的应用是: 测井 生成用于单元测试的模拟 调试需要日志记录,并且模拟可以生成一次,然后在必要时进行更新。 码 不断分享,不断学习

2018年顶级新兴混合应用程序开发公司

没有移动应用程序,您将无法再思考生活,这就是为什么应用程序需要与网络同步而又不失去其本机外观,感觉和易用性的原因。 混合应用程序可以平衡移动网络和本机设备功能之间的这种行为。 难怪,绝大多数移动应用程序基本上都是混合应用程序,除了允许访问网络外,还集成了用于各种应用程序交互的设备功能。 但是,当您寻找顶级的混合应用程序开发公司时,周围有那么多可靠的选择就变得充满挑战。 这就是为什么我们要完成这项几乎不可能完成的任务,将2018年顶尖的新兴混合应用程序开发公司入围的原因。 1. Nimblechapps 总部位于艾哈迈达巴德的Nimblechapps是具有全球客户的端到端Web和移动解决方案提供商。 该公司具有在跨平台和细分市场构建一些最受欢迎和基准广泛的移动应用程序的资格。 出色的创造力和灵活的性能是Nimblechapps开发的移动应用程序的标志。 该公司拥有一支精巧的跨平台应用程序开发人员团队,他们可以通过出色的设计,精确的功能和令人愉悦的用户体验,将任何想法变成成功的应用程序。 该公司已成为全球范围内最有前途的移动应用程序开发商印度公司之一。 Nimblechapps的一些关键专业领域和专业知识领域包括适用于Android,iOS,Windows,Web开发,CMS开发,电子商务和基于位置的服务等的跨平台应用程序。 网站: https : //www.nimblechapps.com/ 2. Zco Corporation 多年来,ZCO总部位于波士顿,成为全球最受推崇的应用程序开发公司之一。 汇集了来自各个专业领域的强大而整洁的才华横溢的开发人员团队,从而催生出了一系列获奖的应用程序。 从提供满足企业需求的定制软件到为各种消费者细分市场构建尖端的移动应用程序,ZCO取得了许多成功案例和行业基准。 高度定制化和针对特定业务的开发重点以及面向结果的方法是该开发公司的两个强大特征。 ZCO的一些关键专业包括针对所有平台(包括iOS,Android,Windows Phone和Windows Desktop)的移动应用程序开发。 网站: https : //www.zco.com/ 3. Appster 这家总部位于澳大利亚的开发公司被称为全球五大开发公司之一。 凭借诸如“澳大利亚最具创新力的公司”之类的奖项,Appster多年来经历了许多自豪的时刻,除了享受稳定的业务增长并触及许多里程碑。 Appster拥有400多个星光熠熠的开发团队和许多荣誉,在任何顶级应用程序开发公司列表中,Appster都是不二之选。 Appster拥有稳固的产品组合,可为各个领域的企业和品牌提供最先进,最成功的移动应用程序。 Appster拥有数百个成功的项目,并拥有一支由众多才华横溢的开发人员组成的团队,拥有丰富的经验,人才库和远见卓识,能够提供出色的移动解决方案。 该公司的一些关键专业包括针对iOS,Android和Windows的跨平台应用程序开发,Web应用程序,企业应用程序和游戏应用程序。 网站: http : //www.appsterhq.com 4.应用大师 这家位于德克萨斯州的美国公司是混合应用程序中最有前途的开发公司之一。 App Maisters在多个大洲拥有数百个并发项目,并拥有全球客户,是跨平台应用程序开发中值得信赖的公司之一。 该公司通过许多成功的项目不断发展壮大,满意的客户遍布世界各地。 App Maisters拥有十年的经验,拥有一支由许多知名开发人员组成的精巧团队,能够兑现其诺言,提供了覆盖和覆盖成功案例的应用程序。 该公司的一些关键专业包括iOS,Android和Windows应用程序开发,企业应用程序开发,云解决方案,网页设计,IOT应用程序开发以及大数据分析和商业智能。 网站: http : //www.appmaisters.com/ […]

使用Flutter进行跨平台移动应用程序开发— Xamarin — React Native:以性能为中心的比较

上周四(2017年8月),我荣幸地在弗吉尼亚州麦克莱恩市的Capital One的iOS峰会上发表了演讲。 这是我第三次参加会议,也是我第二次有机会上台。 场地是一个令人印象深刻的礼堂,组织无可挑剔,听众充满活力和开朗。 我参加了许多有趣的演讲,与来自全国各地的热情软件工程师会面并交流了想法。 我没有演讲视频,但我将分享摘要和幻灯片。 开始了。 移动应用程序开发已经超出了我们最疯狂的梦想。 据估计,全球有20亿部智能手机,其中99%以上运行iOS或Android。 为了吸引更多用户,开发人员需要同时针对这两个平台。 不幸的是,出于多种原因,这样做远非易事。 开发人员必须学习两种语言(在iOS上以前是Objective-C,但现在是Swift;在Android上Kotlin变得比Java势头强劲)和两种平台。 通常,还需要两个平台团队。 这种方法既缓慢又昂贵。 很难调整iOS和Android功能的发布时间表。 至少,App Store审核过程使及时发布iOS更具挑战性。 很难在任何一个平台上提供令人愉悦的体验,甚至更难重复两次。 更糟糕的是,如果并且当需要支持网络时(不幸的是有时是事后的想法),难度将成倍增加。 以前,我们已经看到了跨平台的解决方案,但是它们要么在性能上折衷,要么达到设计期望。 Google,Facebook和Microsoft一直在努力工作,我认为他们现在拥有值得再次关注的解决方案。 我想探索三种流行的框架:Flutter,Xamarin和React Native,解释它们的含义,工作方式,并以性能为重点将它们相互比较。 我的希望是,阅读本文后,您会被启发去检查它们,并足够了解,以便在您的脑海中制定出哪种技术可能是满足您需求的正确选择。 让我们从Flutter开始。 这是由Google开发的开源移动应用SDK。 它为开发人员提供了一种简单而又高效的方法,可以在Android和iOS上构建和部署美观,高性能的移动应用程序。 它的独特之处在于它既不使用Web视图也不使用iOS / Android UI组件,但仍使用其自己的呈现引擎以本机方式绘制所有内容。 Flutter团队没有重新发明轮子,而是对Google内部的项目进行了广泛的研究,并在合理的范围内重复使用了许多现有代码。 他们从Chrome,WebKit,Android中获取了相关内容,并构建了一个苗条的C ++引擎。 他们选择使用Dart构建其余框架。 该框架实现动画,绘画,手势,渲染,并提供Material Design组件的实现以及稀疏的iOS主题组件库。 在iOS上,C ++引擎是使用LLVM编译的,而Dart代码是AOT(提前)编译成本地代码的。 在Android上,C ++引擎使用Android NDK(本机开发套件)进行编译,并且Dart代码在Dart VM(虚拟机)上运行,后者生成JIT(即时)编译的优化本机代码。 实施JIT编译的系统会连续分析正在执行的代码,识别出可能加速的部分,并将这些代码段转换为设备的CPU指令集。 转换后的代码称为本机代码,它直接在CPU上执行,而不是在VM上运行。 Flutter的特定于平台的API支持不依赖于代码生成,而是依赖于灵活的消息传递系统。 应用程序的Flutter部分(客户端)通过平台通道将消息发送到应用程序的iOS或Android部分(主机)。 主机在平台通道上侦听并接收这些消息。 然后,它使用本机编程语言调用任意数量的特定于平台的API,并将响应发送回客户端。 有关典型Flutter应用程序的内存,CPU和GPU利用率的性能讨论,请参考幻灯片。 有趣的是,我在运行这些测试时发现了内存泄漏问题。 我还没有机会向Flutter提交错误,但我将在接下来的几天内提交。 让我们进入列表中的下一个框架Xamarin。 Xamarin是Microsoft开发的一种开源技术,用于使用C#来构建iOS,Android和Windows Phone […]

iOS的协调器模式

当视图控制器必须决定下一个屏幕要推送或显示的内容时,协调器(有时称为流管理器)是对常见问题的解决方案。 为了更清楚地了解这个常见问题,我们知道: UIViewControllers不应显示其他UIViewControllers。 视图控制器应该唯一的职责是呈现数据和捕获事件。 应该有一个单独的组件负责处理演示视图。 它负责流程逻辑,并从视图控制器中删除该职责 换句话说,如果您在视图控制器中的某处有这段代码(或类似的代码),则可能需要考虑使用此模式。 self.navigationController?.pushViewController(someViewController,动画:true) 当视图控制器本身决定将下一个视图控制器推入 self.navigationController 时,视图控制器将紧密耦合 。 使用这种方法,代码库将很难更改和维护,并且视图控制器几乎无法重用。 协调员可以轻松解决此问题 协调器负责管理一组视图控制器,它将负责流程逻辑(流程是一组具有类似用途(例如注册)的屏幕。 它处理导航流程,并负责创建和配置视图控制器。 使用协调器的主要优点是它可以帮助我们从视图控制器中消除这种责任。 这是处理UIViewControllers呈现的更优雅,更简洁的方法。 协调器负责创建导航控制器和任何子视图控制器。 然后,视图控制器是完全独立的,并且不了解使用它们的上下文,从而改善了可重用性和测试。 给我看一些代码 协调人协议: 所有协调员必须遵守协议: 协议协调员:类{ func start() } 这使我们可以将协调器的初始化与开始工作分开。 它可以帮助我们根据需要创建它,并且只有在准备就绪时才能启动它。 公共类AuthCoordinator:协调器{ 私人让navigationController:UINavigationController 公共init(navigationController:UINavigationController){ self.navigationController = navigationController } public func start(){ 如果登录{ showDashboard() }其他{ showAuthentication() } }私人功能showDashboard(){ 让dashboardViewController = DashboardViewController() dashboardViewController.delegate = self self.navigationController.setViewControllers([dashboardViewController],动画:true) }私人功能showAuthentication(){ 让loginViewController = […]

如何将现有的本机应用程序集成到React-Native SDK

为什么写这篇文章? 本文为您的iOS应用程序与React-Native SDK集成提供了非常基础且足够详尽的步骤。 如果按照上述所有步骤进行操作,那么到本文结尾,您将准备好完全集成的React-Native-iOS应用程序。 假定观众 假定您是一名程序员,并且具有为iOS,Android和Web平台中的任何一种构建应用程序的经验。 我希望您将macOS升级到Mojave(版本10.14.1),以使将来的开发更加顺畅。 它着重于使本地应用程序在react-native SDK中运行所需的基本更改。 快速了解React-Native项目的背景 首先让我快速介绍一下为什么我们非常需要这种集成。 我们在nearbuy.com上试图找出哪种UI / UX设计和功能最适合通过Web,M-Web(PWA),iOS和Android等各种平台访问我们产品的客户。 因此,我们开始在Web应用程序和PWA的各个页面上进行实验,这是因为通过部署时间的灵活性和快速向所有可能的最终用户进行更新的实验变得容易。 我们认为通过PWA进行的流量可以充分代表完整的移动流量的行为,即m-web,iOS和android的结合,但事实证明这还不够好,而通过本机应用进行的实验会浪费大量时间和资源因为本地更新涉及许多耗时的步骤,所以它是组织的一部分。 然后我们想到了将现有的本机应用程序集成到React-Native SDK中的想法。 此设置可帮助我们在需要时通过任何数量的动态应用程序更新/实验来吸引最终用户。 缩略语使用 RN:React Native PWA:渐进式Web应用程序 移动网络:移动网络 cli:命令行界面 RN包装器/ RN SDK:RN的“ Hello World”应用 第1步:设置React-Native SDK包装器 这是此设置最简单的部分。 对于初学者,您必须 按照此处的说明安装节点。 通过运行终端命令sudo npm install -g react-native-cli安装RN sudo npm install -g react-native-cli 。 您可以安装一个名为Watchman的软件包来监视文件系统中的更改,尽管这不是首要任务。 现在要创建RN包装器,请首先转到要保留RN项目代码的文件夹,然后在terminal中运行react-native init 命令。 此安装将花费一些时间,因为它涉及到安装诸如react&react-native之类的库以及所有必需的依赖项。 RN包装器已准备就绪,可以进行进一步的集成,其结构应与下图中的结构完全相同,除了项目的名称。 步骤2:安装cocoapods并进行设置 这可以帮助您安装Xcode。 要在Xcode中运行iOS项目,您需要cocoapods。 […]