Tag: iOS应用

每个iOS应用开发公司都应具备的9种本地化工具

当您考虑将iOS应用开发视为一项业务时,您需要调整您的应用以针对应用商店中更广阔的市场。 本地化过程在这方面变得越来越重要。 但是本地化不仅仅是将应用程序的书面内容翻译成外语。 输入后,该字段中的范围就会变得很明显。 在iOS市场上,您可以找到最友好,用途最广泛的应用程序用户。 让我们看一下当今iOS应用开发公司中普遍使用的主要本地化工具。 必读: [iOS应用开发公司可以从10个热门应用中学到[2016] 1.入门:入门是您可以信赖的手工翻译版本,不仅可以用于iOS市场,而且可以用于所有其他市场。 这个地方是一个书呆子社区,可以将您的内容翻译成他们的母语,而无需更改内容的本质和含义。 客户名单包括全球排名第一的约会应用程序Tinder,Skyguide和Cyanogenmod。 他们将本地化所有内容,从应用程序说明和特定屏幕到整个应用程序。 2. OneSky: OneSky是基于云的最顶级本地化解决方案,以最优惠的价格提供40多种语言的高质量翻译。 在OneSky上,所有专业翻译服务均按单词定价。 小型团队可以免费使用其平台,而大型团队则需要为本地化管理系统付费,这取决于您选择的协作者的数量。 任何形式的应用程序和网站都可以进行翻译,但是游戏翻译却分叉了,因为它需要更具创造性和以行话为中心的方法。 3. LocTeam: LocTeam专门从事Mac和iOS本地化。 尽管如此,他们最近也开始在Android领域尝试运气。 您可以根据您的端到端应用本地化需求以及文档和书籍翻译需求来使用它们。 4. Applingua: Applingua,“友好的应用程序本地化代理”专门提供从应用程序本地化和游戏本地化到元数据本地化和应用程序商店文案撰写的广泛服务。 他们将服务扩展到所有平台和每种语言。 他们的翻译都是真正的母语。 收费为每个字0.18美元,并且还会在设备上进行测试以确保出色的用户体验。 另请阅读: 如何启动Android / iOS应用业务 5. Mentez: Mentez开发社交手机游戏,主要专注于拉丁美洲市场。 在过期的社交网站Orkut上,他们拥有五种最受欢迎​​的游戏中的四种。 他们还致力于出版行业,并进行应用程序翻译,应用程序货币化和应用程序推广。 6. ICanLocalize:在ICanLocalize,翻译成本低至每个单词0.09美元。 它是可用于建立应用程序国际化地位的最便宜但最准确的翻译工具。 您可以从IcanLocalize的2000多名经过专业认证的翻译人员中进行选择,他们将为您翻译45种语言。 ICanLocalizians遵循具有成本效益的应用程序本地化技术和方法,例如即时翻译,这可以帮助他们减少项目完成时间,并使他们在很大程度上降低成本。 7.与独立译者合作:尽管有许多成熟的专业服务可用,但由于许多原因,一些iOS应用开发公司仍可能更愿意与独立译者合作以拓展外部应用市场。 您可以在流行的自由职业平台(例如oDesk和Elance)上找到许多值得信赖和经验丰富的翻译。 您可以商定一个适合您的定价模型,无论是按单词付费还是按小时付费。 8.给您的外国朋友一个机会:如果您有全球关系,那么雇用一个众所周知的朋友,甚至是您的一般朋友的朋友都没有错。 通过这种方法,说客户的语言将变得更加轻松。 否则,您可以考虑让他们的服务进行校对,以便获得经过验证的输出。 9.更多在线资源:如果您自己可以做,为什么不尝试使用这些免费的在线资源,这些资源会将您的应用程序放在地图上? Babble-on 缺失的本地化术语词汇表 翻译家的本地化指南 IcanLocalize的App本地化教程 来自Applingua的iOS词汇表

Swift中的NSAttributedString

通过StyleRegEx进行正则表达式渲染 基于标签的渲染很有用,但您也可以将正则表达式匹配样式应用于字符串。 这是通过创建StyleRegEx对象的实例来完成的: 字符串和属性字符串串联 使用+运算符,使用SwiftRichString在纯字符串和属性字符串之间进行连接非常容易! 结论 想更多地了解SwiftRichString的所有机会? 在GitHub项目页面上,您可以找到该项目所有功能的完整文档。 SwiftRichString可用于所有Apple平台,并可通过CocoaPods,Swift PM或Carthage安装。

IOS热门访谈问答(2019年1月)第2部分

本文包括针对IOS职位在VMware中最近提出的问题。 希望对您有帮助。 如有其他疑问,请查看以前的文章-2018/2019年度IOS面试常见问题解答 Q1。 什么是方法混淆,您在哪里使用过? 回答:方法混乱是更改现有选择器的实现的过程。 通过更改选择器如何映射到类的分派表中的基础函数的方式,可以在运行时更改Objective-C中的方法调用,从而使这项技术成为可能。 参考: https://www.uraimo.com/2015/10/23/effective-method-swizzling-with-swift/ https://nshipster.com/method-swizzling/ Q2。 代码审查流程是什么?在审查基于Swift的iOS应用程序时,您需要考虑哪些主要方面? 回答:没有完美的答案,但是您可以尝试覆盖尽可能多的内容,例如内存占用量,应用程序性能,可选项等。 扩展中实现的代表 所有方法应该是私有的,文件私有的还是最终的 是对可选选项的使用最少还是已正确处理 是用的! 强迫解包理性且不易崩溃。 Any或AnyObject的使用应最少。 使用特定的类型或协议。 甚至更好地使用泛型 仅公开需要测试的方法 是否有看似过长的课程? 也许应将某些功能拆分为单独的类。 该应用程序是使用ARC,MRR还是混合编译的? 如果不是全部的ARC,为什么不 该应用程序是否充分利用了常见的可可模式,例如MVC,通知,KVO,延迟加载等? 是否正在采取任何措施,采取不受Apple支持但在iOS世界中越来越流行的模式,例如Reactive Cocoa和MVVM? 是否有负担过多责任的视图控制器? 检查静态调度和动态调度 Q3。 iOS应用程序的单元测试框架是什么,您使用过吗? 回答:一些流行的IOS应用测试框架。 Appium :是一种开源测试工具。 它提供了Android和IOS上的应用程序测试过程的自动化。 它允许用户检查程序源代码的每个单独部分,并在编程过程中系统地完成。 Calabash :是一个IOS自动化测试工具。 该框架的测试过程基于Cucumber(一种广泛的自动化测试工具)完成。 XCTest :是IOS功能测试框架。 该框架可用于在开发过程的任何状态下进行测试。 EarlGrey :是最好的UI测试框架。 这个开源框架易于与IOS集成。 笑话 :是一个自动化的测试框架。 使用此框架,我们可以确保用户界面不会意外更改。 Q4。 什么是模拟? 回答:模拟主要用于单元测试。 被测对象可能依赖于其他(复杂)对象。 要隔离对象的行为,您想用模拟真实对象行为的模拟代替其他对象。 […]

RichTextView

假设您是一名iOS开发人员,并且要求您构建一个呈现HTML的标签。 这很容易,您可以使用NSAttributedString并传入HTML文档类型,使其发挥作用。 如果现在要求您同时显示Markdown和HTML怎么办? 好吧,您可以找到Markdown解析器或构建自己的解析器,并以某种方式与HTML协调。 如果随后要求您显示LaTeX或YouTube / Vimeo链接怎么办? 然后,您必须担心WKWebView以及正确的布局和约束。 好吧,没有更多了。 引入RichTextView,它是UIView的子类,可处理上述所有富文本数据类型 为了使RichTextView处理它可能遇到的各种用例,需要正确格式化输入字符串。 您可以在我们的项目网站上查看适当的输入格式。 输入的格式正确后,将使用WKWebViews呈现Youtube / Vimeo链接,并使用WKWebViews呈现其余的富文本NSAttributedStrings 。 然后, RichTextView将使用SnapKit来动态约束视图,使其在输入字符串中出现的顺序一个接一个。 RichTextView旨在轻松支持根据需要添加更多的富文本类型。 如果您希望获得支持,请随时为我们的回购做贡献。 简而言之, RichTextView是一个功能强大的工具,可用于呈现各种富文本类型。 它是在Swift中设计和构建的,一旦在项目中实现,只要格式正确,它就可以处理您向它抛出的任何类型的输入。 RichTextView可以使用Cocoapods或Carthage集成到您的iOS应用程序中,现在就可以轻松开始在您的应用程序中使用!

iOS应用开发对您的业务的好处

苹果已经通过其iOS设备创建了一个稳定的生态系统,因此在硬件和软件方面都吸引了众多忠实拥护者。 对于印度的ios应用程序开发公司而言,这使iOS成为极为有利可图的平台。 除了iPhone硬件本身非常受欢迎之外,iOS本身还是一个可以为您的企业发展的绝佳平台的原因很多。 安全 在当今广泛连接的时代,即使是最不了解智能手机的用户,安全性也是一个很大的问题。 对于企业来说,它应该是最高优先级。 保护企业的敏感数据免遭入侵对于企业至关重要,值得庆幸的是,iOS平台具有固有的安全性,可以使企业以安全的方式管理其数据以及客户的数据。 可扩展性 iOS应用程序的主要优点是它们在发布后具有极大的可扩展性。 只要硬件支持,随着平台的发展,就可以添加新功能和附加功能。 一致直观的用户界面 应用程序可以通过其用户界面生存或死亡,而且值得庆幸的是,Apple在用户界面方面已经设定了标准。 只需维护此用户界面,即可使应用程序直观且符合Apple的标准,从而减少用户在迷宫般的菜单中迷失的时间。 高投资回报 租用iPhone应用程序开发服务通常比在其他平台上花费更高,许多研究表明,iOS用户通常比其他平台上的用户在应用程序上花费更多。 这使收回投资的机会大大增加,从而使iOS平台利润丰厚。 安全交易 苹果公司一直非常重视安全性,并且由于存在iOS平台来出售应用程序,因此在智能手机上进行的交易数量已大大增加。 Apple已确保这些交易也很安全,因此企业在将其付款结构集成到应用程序中时应该没有问题。 品牌价值 人们信任苹果,无论是软件还是硬件。 这使在iOS平台上进行开发对于企业而言是一个好主意,因为人们会固有地信任Apple支持的平台上可用的应用程序。 这极大地有助于消除人们在购买手机之前的犹豫。 高品质的应用程序 对于商店中可用的应用程序,Apple有着极其严格的标准。 在选择让另一家公司为iOS平台开发应用程序之前,这应该使您放心,因为Apple不可能将不合格的产品上传到Apple Store。 如清单所示,虽然iOS开发可能会有一些负面影响,但专业人士所带来的后果却远远超过了其后果。 对于希望通过应用程序增强其产品的开发人员和企业而言,iOS平台仍然非常有利可图。

IOS热门面试问答(2019年4月)第一部分

下一页 :IOS面试常见问题解答(2019年4月)第二部分 什么是可可粉? Cocoa和Cocoa Touch分别是OS X和iOS的应用程序开发环境。 Cocoa和Cocoa Touch都包含Objective-C运行时和两个核心框架: Cocoa (包括Foundation和AppKit框架)用于开发在OS X上运行的应用程序。 Cocoa Touch (包括Foundation和UIKit框架)用于开发可在iOS上运行的应用程序。 2. Swift 5有什么新功能? https://medium.com/ios-expert-series-or-interview-series/whats-new-in-swift-5-0-25dc37f56f29 3. Nil和NULL之间的区别? 4. AnyObject和Any之间的区别? Any可以代表任何类型的实例,包括函数类型。 随着Swift 3的发布, AnyObject和Any含义已经改变。 在Swift 3中,Objective-C中的id类型现在映射到Swift中的Any类型,该类型描述任何类型的值,无论是类,枚举,结构还是任何其他Swift类型。 此更改提高了Swift和Objective-C的兼容性。 例如,从Swift 3开始,Objective-C集合可以保存Any类型的元素。这意味着Foundation的NSArray类型可以存储String , Float和Int实例。 AnyObject是所有类隐式遵循的协议。 当您需要无类型对象的灵活性时,或者使用桥接的Objective-C方法和返回无类型结果的属性时,可以使用AnyObject 。 AnyObject可用作任何类,类类型或仅类协议的实例的具体类型。 AnyObject协议还可用于弥补Swift和Objective-C之间的鸿沟。 一些Objective-C API使用AnyObject协议来提供与Swift的兼容性。 5.什么是@synthesize和@dynamic? @synthesize将为您的属性生成getter和setter方法。 @dynamic只是告诉编译器,getter和setter方法不是由类本身实现的,而是由其他地方实现的(例如超类或将在运行时提供)。 使用propertyName提及@dynamic会告诉编译器不要创建访问器方法,因为用户将来会动态提供实现。 苹果允许其开发人员在运行时使用动态方法解析提供方法实施。 6.什么是inout参数? 传递给Swift函数的所有参数都是常量 ,因此您无法更改它们。 如果需要,可以传入一个或多个参数inout ,这意味着可以在函数内部更改它们,这些更改反映在函数外部的原始值中。 func doubleInPlace(number: inout Int) { […]

自调整TableView单元格

最近,一些初级的iOS开发人员向我询问了可自动调整大小的tableview单元(根据其内容增长的单元),并意识到从理论上解释它的工作原理是一个不错的起点,但是有一个示例对其进行备份甚至更好。 因此,今天我们将在上方创建聊天单元! 自定义大小的单元格根据其子视图的大小要求确定其大小。 正确设置高度的技巧是防止高度模糊的布局约束。 那是什么意思呢? 例如,一个标签被限制在单元格内容视图的顶部和顶部锚点上。 随着文本长度的增加,标签会垂直增加吗? 还是水平? 或两者? 在什么条件下? 横向增长是无限的吗? 这就是我含糊不清的意思。 答案当然是,鉴于当前的限制,标签将无限制地水平增长。 这是不好的。 我们的单元应具有最大宽度和可变高度。 那么该怎么办? 首先,让我们谈谈一般策略。 可以将单元格的contentView看作是矩形橡皮筋。 只要子视图共同顶着顶部和底部,并一直向上和向下相互抵触,从而形成类似堆栈的结构,则内容视图(如橡皮筋)将拉伸以容纳其子视图-使用集体固有尺寸其子视图的大小。 好的讨论,让我们进入代码,看看我们可以学到什么! 从总体上讲,这是我们的目标结构。 橙色勾勒出内容视图,蓝色圆圈勾勒出图像视图,红色代表标签,绿色代表标签的超级视图,这就是我们将要应用的圆角半径以及赋予标签的原因文字气泡边缘的一些填充。 ChatCell.swift 重要的是要注意messageLabel的numberOfLines属性必须设置为0。 仔细检查第50–62行的约束,您会发现以下几点: 所有子视图都限制在其各自的父视图的顶部和底部。 图像视图具有固定的大小,但也具有lessThanOrEqualTo底部约束。 messageBackground没有明确的高度,但其尾锚具有最大值。 它还具有lessThanOrEqualTo底部约束。 messageLabel在它和messageBackground之间有一个边距,但是它限制在messageBackground的所有边缘。 首先确保子视图与contentView的顶部和底部相对。 第二个方法确保如果messageBackground小于imageView的固定大小,则imageView将直接推向contentView的底部,确定其高度。 如果messageBackground大于imageView? lessThanOrEqual to bottom约束将确保imageView不会被拉长,因为它可以进一步远离底部。 第三,从lessThanOrEqualTo底部约束开始,将保证与上述图像视图的底部约束相同的行为。 真正的钱是,第三个提供了消息背景的最大宽度,这意味着在达到最大值之后,messageLabel将被迫向下增长,从而导致高度增加🙌🏽 与第四个项目符号结合使用,因为标签卡在messageBackground上,所以随着标签的增长,背景将被迫增长。 随着背景的增长,contentView也将随之增长! 🎉 您需要做的最后一件事是设置表视图的rowHeight和estimatedRowHeight如下所示: tableview.rowHeight = UITableViewAutomaticDimension tableview.estimatedRowHeight = 50 只是为了让您不知道为什么,这是来自Apple的直接解释: 要启用自动调整大小的表格视图单元格,必须将表格视图的rowHeight属性设置为UITableViewAutomaticDimension 。 您还必须将一个值分配给estimatedRowHeight属性。 一旦设置了这两个属性,系统就会使用“自动布局”来计算行的实际高度。 就像这样,我们有自动调整大小的单元! 👏🏽 […]

在iOS应用中处理大文件

我们如何使Kaleidoscope for iPad尽可能灵敏。 近十年来,万花筒一直是一种流行的生产力工具,这有充分的理由:桌面应用程序具有无与伦比的性能,因此可以无缝地进行文件比较和合并。 当我们着手将万花筒带入iPad时,我们知道过渡将相对简单。 但是,由于预计通过平板电脑的基于触摸的UI可以快速轻松地进行交互,因此我们预计在开发过程中会遇到一些障碍。 最大的三个挑战是: 比较两个文本文件后,快速显示较大的文本差异。 快速响应由多任务处理(即,打开第二个应用程序)和设备旋转引起的UI大小更改。 确保在较大的文本差异中滚动是平滑且无死角的。 所有这些挑战都是相关的; 共同的主题是确保在处理大型文本差异时,该应用程序具有尽可能高的响应速度。 清除障碍 创建大型,复杂的文本比较既费时又会影响性能。 为了提高效率,我们确保仅在需要时才产生文本差异。 为了清除出现不必要的文本差异的实例,我在Xcode中创建了一个断点,该断点可以播放声音并在产生差异时继续执行。 如果我听说过应该不生成差异时遇到断点的情况,我将调查原因。 使用并发队列 在构建高响应性应用程序时,重要的是您必须并行执行尽可能多的工作。 由于文本差异涉及比较两个文本文件,因此在UI中布置差异的逻辑还涉及两次执行某些操作(每个文件一次)。 我们使用OperationQueue类的实例创建并发工作项队列,同时执行了这些“对”工作项。 例如,由于各种UI布局原因,必须计算文件中每行文本的渲染高度(可能是换行高度)。 这些行高测量可能需要一段时间才能完成,尤其是对于大型文本文件。 因此,我同时测量了每个文件作为单独的Operation对象的行高。 这两个操作被添加为使用它们收集的线高信息的操作的依赖项,因此,一旦该信息可用,将自动开始需要线高的工作。 缓存布局信息 如上所述,计算文本差异的布局可能很耗时。 信息一旦存在,就将其保存在内存中,并以文本差异UI的宽度为键。 缓存的信息有助于确保旋转设备或通过同时打开另一个应用程序来调整窗口大小,从而尽可能地做出响应。 如果用户碰巧调整iPad的系统范围的字体大小首选项“动态类型”,则清除缓存的布局信息,因为字体大小的更改要求重新计算所有布局信息。 优化性能 在Instruments中使用Time Profiler可以帮助确定性能瓶颈。 有时,在较小的文本差异上效果很好的数据结构或算法最终会成为较大数据集的严重性能问题。 仪器(特别是Time Profiler仪器)派上了用场,以查看我的哪些方法正在占用CPU。 一旦确定了问题区域,便可以设计出一种更有效的方法。 仪器的使用极大地帮助了这种“使之工作,然后根据需要进行优化”的方法。 使用阵列节省时间 避免执行许多Swift字符串连接,而是加入字符串数组。 使用+ =从很多片段中构建一个大字符串比将那些较小的字符串添加到数组然后调用join方法要慢得多。 对于大量文本,此优化将方法花费的时间从10秒减少到大约10毫秒。 新设备,不折不扣的性能 在iPad上,性能可以说比在台式机上更为重要,因为用户可以触摸UI并期望立即得到响应。 加上iPad具有比台式或笔记本电脑更低的马力这一事实,因此保持警惕以确保性能保持尽可能合理变得更加重要。 随着我们为iPad改进万花筒,我们将继续将性能和响应能力放在首位,并在此过程中与您分享我们的见解。 立即下载iPad版万花筒,免费试用14天。

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

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

Xcode 10(Swift 4.2)中的自定义圆形按钮

Xcode故事是设计iOS App外观的最佳方式之一,到目前为止,它仍有一些局限性。 今天,我将教您最简单的方法来实现圆形按钮,而无需导入任何精美的库。 让我们开始: 创建一个新的子类UIButton的 swift文件(我将命名为RoundButton.swift )。 2.在RoundButton.swift文件中粘贴此代码。 import UIKit @IBDesignable class RoundButton: UIButton { @IBInspectable var cornerRadius: CGFloat = 0{ didSet { self .layer.cornerRadius = cornerRadius } } @IBInspectable var borderWidth: CGFloat = 0{ didSet { self .layer.borderWidth = borderWidth } } @IBInspectable var borderColor: UIColor = UIColor .clear{ didSet { self .layer.borderColor = […]