Tag: iOS应用开发

iOS提示:本地化iOS应用

介绍 因此,这里有个故事,您已经制作了自己的应用程序,一切都可以正常工作,拥有良好的用户基础,现在您想将其扩展到海外(或者您只是创建一个新项目,并且已经希望将其本地化😜)。 设置项目进行本地化 因此,在我们开始之前,我们需要在您的项目设置下选中“使用基础国际化”。 现在,您可以通过单击“ 本地化”列表下的+按钮并选择新的语言来添加希望您的应用程序支持的语言。 标记可本地化的字符串 将您的Strings标记为可本地化是非常简单的,您只需要使用NSLocalizedString来包装它,该方法仅需要两个参数: key :您的可本地化字符串 comment :对翻译的评论 NSLocalized(“我爱雨燕”,评论:“雨燕情书”) 这使Xcode可以映射所有本地化的Strings以便以后导出( 请注意:如果将字符串分配给变量并将其传递,因为关键参数Xcode不会将其导出以进行本地化 )。 本地化情节提要和Nib文件 您也可以将Storyboard和Nib文件标记为本地化,但是只需标记一下右面板内的Localize…按钮,而不是标记每个字符串。 并选择您要支持的其他语言。 导出,本地化和导入 这是我最喜欢的部分,因为我们已经将字符串包装在NSLocalizedString并将Storyboard和Nib文件标记为可本地化,所以我们现在可以导出项目以进行本地化。 要将项目导出以进行本地化,您需要: 在“项目浏览器”面板中选择项目。 在Xcode菜单栏中,选择编辑器>导出以进行本地化…(这将搜索NSLocalizedString ,Storyboard和Nib文件内的任何字符串) 保存到以后可以找到的任何位置(我通常将其保存在桌面上) 在任何xliff编辑器中编辑导出的.xliff文件,以翻译您的字符串(我个人使用XLIFFTool,因为它非常简单且免费) 完成翻译后,在Xcode菜单栏中,选择“编辑器”>“导入本地化…”。 测试您的本地化应用 好了,现在我们已经完成了所有工作,是时候查看我们的本地化在界面中的位置了。 使用Xcode 9测试本地化非常方便,您无需更改设备或模拟器的语言和区域,现在您可以使用语言环境和语言配置来编辑方案。 要编辑您当前的方案,请转到产品>方案>编辑方案,或者只是选择单击您的方案。 现在转到选项标签,并将“应用程序语言”和“应用程序区域”更改为您已本地化的任何语言。 关闭方案编辑器,运行您的应用程序,使其外观看起来像现在! 🌎 谢谢! 感谢您阅读这篇文章,希望您至少学到了一点。 如果您有空闲时间,可以签出我的GitHub! 😉

使用RxSwift上传多媒体帖子

我们的App有一个很重要的功能是,上传潜水日志。一则潜水日志的内容除了一般的文字内容之外,还可以包含图片,影片等多媒体消息。 原始工具 原本的上传程序码实作在一个显示上传进度的画面中,前后将近三千行。更新画面的程序与异步API调用关联在一起,结果就是发生问题不容易跟踪/调试,不易做画面调整,多-线程调整,也不容易做错误处理。而原始使用条件锁来确保程序的前后关连性,循序加载的结果也造成速度慢,无法有效利用手机及网路的效能。 需求分析 一则Divelog可能包含多张照片,影片,影片需要上传缩图。 多媒体档案需先上传到AWS S3 多媒体档案上传成功后将URL组入divelog对象再调用API上传Divelog 若上传有失败就不要继续往下做 Divelog上传完毕还有两个后处理的API要调用 需要在画面显示上传进度 发布成功要删除一些缓存的资源 未来还有离线发布/定期上传Divelog的需求 未来重建发布Post画面时也希望可以重用UploadTask 重点:各照片/影片的上传之间没有前后关连性,但希望可以在全部上传完成之后再做后续动作。 既然有这么多上传动作要完成,又需要各别状态与进度。我先做了一个UploadTask的基类: 一个DivelogPost的UploadTask实际上包含n张照片的UploadTask以及,如果有video的话,需要一个UploadTask上传video本身,以及一个UploadTask负责上传缩小图。流程看起来像这样: 使用RxSwift CombineLatest将这些任务的行为整并在一起,等全部都完成了再往下打PostAPI跟后续的处理。 中间的任何一个任务有错误,都可以送错误出来。如此也可以把错误处理统整在一起处理。 技巧 PublishSubject需先送一个初始值出来,不然progress不会开始跑。 可以写个FailTask​​测试错误流程 想清楚之后写起来其实很快,纠正之后流程就相当清楚,也不容易发生哪一条路的错误处理漏掉,让画面挂住无法继续使用的状况。 发布流程清楚明了,与画面解构。 各UploadTask对象可在其他需要上游的地方重用。 易于将上传进度更新到画面。 容易处理错误状态。 未来实作离线发布功能时,实作从离线返回在线状态,实作多篇文章发布上传也很简单。需要平行或循序上传也容易切换。 未来重建一般帖子上传介面时,也可直接重用PostUploadTask 这整体上传流程开发完成后,虽然没能够在短时间之内应用到专案内所有上传。但当后续要替换其他地方的上传行为,甚至也不必由自己进行开发,交给其他同事也都能够轻易接手实作。 其他可以再improve的地方 或许改用协议而非基类? 以操作实作 将progress与status合并为同一个PublishSubject 当初在定义UploadTask的基类时,并没有特别想到什么,只是有个感觉就开始做了。定义了类。或许下回再实作时可以再好好回顾一下Operation的其他特性。 这也是我第一次尝试使用RxSwift。重点在使用可观察的模式以及利用最新的管控流程,整体来说写起来还蛮简洁的,并没有用的多么流利或与一般实作有多不同。范围小心使用,尽量不要为用而用的无限扩张下去。

WWDC 2017国情TL; DR

这是我们在WWDC 2017的“国情咨文”演讲期间从苹果公司获得的一切的简要回顾。 源代码编辑器 从头开始用Swift重写 内置降价编辑器 更好的修复(内联并且不破坏格式) 300多种新的诊断程序,分析仪及其修复程序 文件打开速度提高3倍,滚动速度达到60 fps,行跳移速度提高了50倍 在Playgrounds的代码编辑器中标记化(悬停时按住Cmd) 动作的上下文菜单(在标记化结构时点按) 全新的重构系统 Cmd +/-调整代码文本的大小 SDK版本可用性修复 协议实施存根修复 “提取”将实现移至其自己的方法/ let 重命名/编辑范围 跨源代码进行全局重命名/重构-跨所有片实时更新 开源转换/动作-开发人员可能会引入新的东西 斯威夫特4 字符串现在是字符集,就像数组一样 带”””多行字符串文字 单边范围和使用下标的字符串切片 Unicode 9 Grapheme Breaking(Unicode 9字素突破)-更好地支持Unicode(相对于旧版本,它实际上是正确的) 可编码协议:编码/解码JSON / plist的超级超级简单方法: try JSONEncoder().encode(Codable) vs try JSONDecoder.decode(Type.self, from: payload) Xcode 9 Swift语言版本(3.2 / 4.0)-允许逐步升级到Swift 4 构建时间:混合和匹配Swift / Objective-C的速度应提高40% 整个模块优化应该有更好的构建时间(大约2倍)(从Xcode 8.3.2开始,理论上来说) 核心技术 索引器 完全重新架构 快速打开x35更快 […]

iOS体系结构模式Swift

在iOS中开始新项目的最重要问题之一是为我们的项目选择哪种体系结构,在对该问题进行了一些研究之后,我在VIPER(视图交互器演示者实体路由)中发现了解决此问题的好选择,因此,我创建了一个泛型生成器,该类自动生成类的自动生成器,该类具有通过VIPER进行通信的协议。 此解决方案基于@rayvinly在Clean Swift上创建的模板 使用VIPER模板的存储库在这里:https://github.com/alejouribesanchez/VIPER-Generics-Generator 交流的方式很简单,在该存储库中,有一个可以在此图中抽象的示例: 例 该示例是一个简单的应用程序,使用viper架构从Internet /本地存储中加载数据,其主要动作是当用户单击按钮LOAD DATA时,视图控制器调用Presenter。 如果无事可做,则演示者将执行业务规则,演示者将调用交互器;如果未完成业务规则,则演示者将调用视图控制器以通知用户。 调用交互器后,它将进行连接以获取数据并将对象返回给演示者。 然后,演示者将信息应用于业务规则,并通知视图控制器以显示正确的消息。 该体系结构的所有组件都必须实现自己的协议,该协议的思想是要了解视图,演示者和交互者的作用。 在此处进行示例:https://github.com/alejouribesanchez/VIPER-Generics-Generator/tree/master/ViperExample 感谢您的阅读! 如果您喜欢这篇文章,请单击“推荐”(❤按钮),以便其他人也可以阅读它= D 如果要聊天, 请 在Instagram上关注我: https : //twitter.com/alejouribes https://www.instagram.com/alejouribesanchez/ 如果要聊天, 请 在Twitter上关注我: https : //twitter.com/alejouribes

你好三角,认识斯威夫特! (和宽色)

对于想要开发Metal的iOS开发人员而言,自然的起点是Apple的Hello Triangle演示。 它确实是金属的“ Hello World”。 它所做的只是将一个二维三角形(其角分别为红色,绿色和蓝色) MTKView到MTKView 。 顶点着色器和片段着色器几乎一样简单。 即使这样,这也是开始弄清管道各部分如何组合的好方法。 唯一的是-它是用目标C编写的。 作为Swift开发人员,我发现自己希望看到该语言的Hello Triangle版本。 因此,我决定将其转换为Swift。 (转换本身非常简单:您可以在此仓库中查看代码。) 为了使事情更加有趣,我还更新了该演示以支持宽色彩,这在Apple的生态系统中意味着使用Display P3色彩空间。 (宽色是指显示超出传统色域(称为sRGB)的颜色的能力;这是我在之前的文章中所探讨的。) 在“ Hello Triangle”中支持宽颜色在概念上很简单:不要将顶点设置为sRGB中定义的纯红色,绿色和蓝色,而是将它们设置为“ Display P3”中定义的纯红色,绿色和蓝色。 在支持该功能的设备上,三角形的角将显得更明亮,更生动。 但是作为金属新手,我觉得有些棘手。 在MacOS中, MTKView类具有可设置的colorspace属性,这大概使事情变得很简单-但在iOS中,该属性不可用。 因此,我尚不清楚我在Metal管道中的哪个位置进行调整以支持广泛的色彩。 我在这篇出色的Stack Overflow回复和相关博客文章中找到了答案。 作者解释了如何将Display P3颜色值(范围从0.0到1.0,但实际上是指比正常范围更大的颜色空间)转换为扩展的sRGB值(与标准sRGB相当,但它们可以为负或大于sRGB)。 1.0)借助矩阵变换。 确切的数学运算取决于colorPixelFormat的MTKView ,它确定在哪里应用gamma。 好的,关于伽玛:伽玛校正的要点是,在保存图像之前,色彩强度通常会通过非线性函数传递。 因为大多数图像只有256个亮度级别,并且人眼对暗色的变化非常敏感,所以伽玛功能有助于存储更多的暗度,从而牺牲了明亮的强度。 这些值随后在显示在显示器上时通过反函数传递。 由于伽玛编码不是线性的,因此在编码之前均匀分布的值(也称为压缩)在编码之后不会均匀分布。 (此博客文章对伽马校正有很好的解释。) Metal管道中可能发生很多隐式的伽玛编码和解码,并且如果您在不知道自己处于哪种状态的情况下操纵值,则事情会很快搞砸。 正如我从较早的博客文章中了解到的,当将多种颜色呈现到MTKView时,有两种处理伽玛的选项: 将您的Display P3颜色值转换为sRGB中的线性 (未编码)对应值,并允许MTKView通过选择像素格式.bgra10_xr_srgb为您应用伽玛编码。 将P3值转换为线性sRGB,然后通过选择像素格式.bgra10_xr预先在数学上.bgra10_xr应用伽玛编码。 在此演示中,这是将左角的“扩展”颜色转换为1.2249, -0.04203, -0.0196 (这是P3最红的红色,转换为线性sRGB)与将其转换为1.0930, -0.2267, -0.1501 (P3的1.0930, -0.2267, -0.1501最红的红色,是应用了gamma编码的 […]

学习Swift和iOS开发第6部分:循环

循环是重复的代码块,我们可以用来对Swift中的多个数据执行一项操作。 DRY原则指出“不要自己重复”。这是一种已存在很长时间的编码原则,但是Swift中的循环是重复代码的块。 如何使用循环是一种好习惯? 虽然循环反复重复相同的代码,但这样做是在单个循环的范围内进行的。 例如,我们可以从数组中传入数据,并且可以对该集合的每个项目执行相同的操作。 这是Swift语言非常有用的组件。 在这篇文章中,我们将学习3种流行的Swift循环类型。 让我们变得循环! 🙃 搭建游乐场 首先,如果尚未打开Xcode,请点击Create New Playground 。 给它起一个类似Loops的名称,然后单击Next 。 选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该看到类似以下的屏幕: 删除左侧的所有样板代码,但根据需要保留import UIKit 。 为什么要使用循环 假设我们有4名员工在公司工作。 每个员工的薪水不同: 员工1:$ 45,000 员工2:$ 100,000 员工3:$ 54,000 员工4:$ 20,000(对不起,兄弟)。 创建4个变量(每个雇员一个),并将每个变量的值设置为上面的相关薪水: 导入UIKitvar employee1Salary = 45000.0 var employee2Salary = 100000.0 var employee3Salary = 54000.0 var employee4Salary = 20000.0 我们刚刚完成了2016年第四季度,我们度过了非常成功的一年。 我们希望给每个员工加薪10%。 在您的游乐场中,键入: 导入UIKitvar employee1Salary […]

通知中心II📻

Merhaba, öncekiyazımdabir olaygerçekleştiğindebir veya birden fazlanoktayıtetiklemek istiyorsam Notification Center kullanabilirim,bununla birlikte veriaktarımıdasağlayabilirimdemiştik。 Kendimiz bir notificationtanımlamış,olaygerçekleştiğindekendiyarattığımıznotification’ıdinlemişonagörehareketetmiştik。 Buyazıdaise通知yaratmayacak,框架varolan通知larıdinleyeceğiz。 Peki bunotification’larınnelerolduğununeredenbileceğim? 扩展名Notification.Name {}} eklindetanımlanmışkısımiçerisindebulunmaktadır。 共有个人资料iktiyacımızdoğrultusundakullanabiliriz。 O zaman bir denemeyapalım。 用户界面UITextfield和UIKeyboardNotification’larıüzerindengideceğiz。 hanginotification’larıdesteklediğinigörmekiçinUITextfieldclass’ınagidipbakıyoruz。 UIKeyboard通知我的通知。 UITextfield editlemebaşladı,通知和通知通知。 UIKeyboard isgörünüyor,göründü,kayboluyor,kayboldudurumlarıiçin通知kullanabilirsiniz diyor。 O zaman bunotification’larıdenemeküzerebir denemeyapalım。 AzağıdakiView Controller’da bir标签var,yapılanişlemlerimizinanlıkdurumunu onunlagöreceğiz。 Bir textfield ve bir按钮var。 UITextfield正常şartlardaaktifedildiğindeklavyeaçılacağıiçinklavyeninarkasındakalacak。 Böylebir durumu engellemek文本字段editlenmeyebaşladığıanda klavyeninyüksekliğikadar view’imiziyukarıçekeceğizkitextfield’ımızklavyeninarkasındagizlikalmasın。 1-Notification’larıdinlemeküzereNotificationCenter’a kaydet Kullanmakistediğimiznotification’larıaddObserver […]

iOS 11有什么新功能?

iOS 11 Beta:新功能? 5月的最后一周,Apple放弃了iOS 11的第一个公开测试版(iOS 11 beta),现在可以下载。 苹果计划在今年秋天晚些时候发布最终版本,有传言称它将与新的iPhone 8一同推出,与新的iPhone 8一同推出。iOS 11 beta包含了大量的UI改进和其他新功能。 在此博客中,我们将讨论开发人员可以从新更新中期望什么,它将支持哪些设备,并简要说明对测试人员意味着什么? iOS 11的新功能 通过对Siri,Messages,照片,Apple Pay和其他第一方应用程序和服务进行了多个后端增强,带来了最重大的变化。 例如,地图获得了新的“请勿打扰”功能,以确保安全驾驶,并为大型购物中心和机场的室内地图添加了其他资产。 此外,Siri还获得了更新的语音响应系统和其他智能功能。 最值得注意的是,在UI方面,现在已经完全重新设计了Control Center,其面板系统标榜了各种应用程序和系统控件。 最后,值得注意的是,由于升级了用于机器学习的Core ML和新的ARKit工具,Apple已经掌握了证明改变游戏规则的新技巧,因为它们将提供大量增强现实应用程序供用户浏览,从而提高了用户体验。 这是在苹果公司严重考虑人工现实,今年晚些时候推出的新型Home-pod扬声器以及机器学习的重要性的时候。 那么,这对全球的开发人员和测试人员意味着什么呢? 让我们更深入地研究他们最有前途的新更新。 Apple通过适用于iOS的ARKit拥抱增强现实 在继续对公司的App Store进行更改的过程中,Apple对Pokemon Go表示赞赏。 它还引入了一组新的API,这将允许更多开发人员将增强现实应用程序引入iOS设备。 AR在顶级技术公司的认可和健康态度上度过了一年。 Facebook在F8引入了AR Camera平台,而Google继续更新Tango以及新的AR应用程序Google Lens。 苹果全球副总裁Greg Joswiak最近提到了名为AR Measure的ARKit演示应用程序,该应用程序于上周早些时候在社交媒体平台上广为传播。 ARKit基本上是一种将3D对象现实地放置在“真实”位置以增强真实感的解决方案。 这将改变游戏规则。 以家具和室内装饰行业为例,他们拥有数以百万计的图像,并保存了其资产的3D模型,现在可用于开发此工具。 对于3D模型,存在很大的需求和大量的内容来填充AR宇宙。 苹果现在已经打开了通往数百万个可用门户的道路,每个物理出口都有可能与AR分层。 这将使堆栈中的设计师技能向上移动,从而将现实世界可视化到移动设备中。 对应用程序的思考重点还将与语音,摄影和语音等其他技术结合在一起,而无需适应现有的AR系统或从头开始构建它。 iPad的完整改造 苹果公司通过多点触控技术,借助新的iOS 11将变革性的焦点转移到iPad上,具有升级的功能和扩展的功能。 UX已经完全改变,主要侧重于多任务处理,为iPad用户提供了更加流畅和连接的体验,这是一个主要的抱怨。 例如,其拖放功能带有一个新的扩展坞,该扩展坞使您可以在全屏应用程序顶部的应用程序之间移动。 如果需要同时使用两个应用程序,则仍可以使用拆分视图功能同时打开两个应用程序,通过从扩展坞中拖动一个应用程序并将其放到所需的一侧以替换这些应用程序中的任何一个,依此类推。 开发人员将不得不接受新的框架。 设备获得iOS 11 许多使用iOS的设备都在使用iOS […]

iOS集合视图

转到Main.storyboard,添加“收藏夹视图”和“收藏夹视图单元格”。 将图像添加到“ Assets.xcassets”文件夹中。 将“ ImageView”和“ Label”添加到集合视图单元格。 根据需要调整大小。 设置“集合视图单元格”的标识符。 创建一个新文件,类型为“ UICollectionViewCell”。 控件将图像视图和标签从集合视图单元格拖动到此新文件。 转到视图控制器swift文件。 控件拖动“集合视图”到视图控制器。 扩展文件以包括“ UICollectionViewDelegate”和“ UICollectionDataSource”。 在“ viewDidLoad”函数中,添加以下行 FeaturedCollectionView.delegate =自我 FeaturedCollectionView.dataSource =自我 您将需要为集合视图和数据添加另外2个功能。 我正在使用2个数组,标题和图像名称。 这是一个示例数据数组。 let标题= [“死侍2”,“复仇者联盟:无限战争”,“坏撒玛利亚人”,“阻止者”] 让图片= [“死侍2”,“复仇者”,“坏撒玛利亚人”,“阻止者”] 此功能用于告诉您将有多少个单元格。 func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { 返回titles.count } 此功能用于设置单元格内容。 func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell { 让单元格= featureCollectionCollectionView.dequeueReusableCell(withReuseIdentifier:“ featuredCell”,for:indexPath)为! FeaturedCollectionViewCell cell.imageCell.image = UIImage(名称:images [indexPath.row]) cell.labelCell.text =标题[indexPath.row] 返回单元 […]

Swift中的通用可选处理

有时,您希望编写一种适用于任何Optional类型的通用算法,无论包装在里面的是哪种实际类型。 好的,这可以使用免费的泛型函数轻松完成,但是例如,如果要编写Sequence扩展以删除所有nil值怎么办? 由于Optional不是协议而是具体类型,因此事情变得有点复杂,因此不能将其用作通用类型约束。 Swift中的通用协议和具体类型具有不同的用途:我们创建实例并声明具体类型的变量,而协议则可以用作通用类型约束。 类型擦除是一种在我们要声明一个能够容纳符合特定协议的任何具体类型的变量时使用的技术。 相反,我们想要的是同一难题的另一部分,我们需要一个协议,允许我们将具体的泛型用作约束。 用英语听起来这听起来很复杂,但通常情况下,用普通的Swift编写起来看起来要简单得多。 因此,这里我们只定义一个OptionalType协议,声明WrappedType关联的类型,并使Optional枚举符合该类型。 请注意,泛型类型参数不会自动满足协议要求,但是这里我们有类型推断。 为了使该协议有用,我们公开了一些基本的Optional功能: asOptional属性使我们可以访问可选的绑定语法。 ExpressibleByNilLiteral一致性允许我们使用nil进行初始化。 完成之后,我们现在可以将OptionalType用作一般约束: 如果您正在寻找可以使用Optional枚举完成的更多技巧,则应查看Russ Bishop撰写的精彩文章。