Tag: 移动应用开发

iOS上的KEA Place是一款出色的AR应用程序,但其成功还有更多

自2013年以来,宜家就一直在尝试让客户使用App将家具放置在自己家里的方法。自iOS 11和ARKit发布以来,宜家App一直被视为该技术的展示。 宜家的“地方”应用程序很棒,但并非出于您可能认为的原因…… 技术栈 IKEA Place使用ARkit来检测地板的水平平面以放置家具,并利用Core Motion和视觉惯性测距法。 它不是唯一使用这些技术的应用程序。 他们已将其与Unity引擎(支持ARKit)配对。 宜家似乎已经充分利用了自己作为早期技术适配器并将其应用于AR的经验,这似乎仍然是未来的巨大机遇。 但是在2019年,感觉这已经不是曾经的移动设备的创新应用了。 宜家还做了哪些工作才能使Place变得更好? 下载MNC应用 宜家允许从Apple的任何App Store中安装该应用程序,并在安装后更改语言和本地化选项,并包括宜家运营的所有地区。 即使您使用的不是母语,设置页面也易于使用。 更改语言时,界面不会在更新时被锁定。 这意味着我无需更改App Store即可看到SGD(新加坡元)的价格; 精彩! 不仅如此,对语言的更改不需要重新启动,甚至允许用户在语言更改时继续使用该应用程序。 这些功能使下载应用程序的摩擦降低,并使卸载率保持较低。 这不是他们所想的。

在Swift中开始使用自定义代理的两种方法

您是Swift委派的新手吗? 让我们讨论两种在代码中开始使用委托和协议的好方法。 但是首先,代表是什么? 委托是一种设计模式,当特定事件发生时,该模式允许一个对象与另一个对象进行通信。 委托对象保留对另一个对象(委托人)的引用,并在适当的时间向其发送消息。 这使我们可以更新委托以反映事件的完成。 大! 因此,让我们谈谈开始实现自定义委托的最简单的地方。 显示弹出窗口并检测与该窗口的用户交互 要创建一个弹出窗口,请在您的项目文件中添加一个新的CocoaTouch View Controller类,然后选择“还创建XIB文件”框。 这是我们将构建弹出视图的地方。 我们将其命名为“ PopUpViewController”。 这将是我们的委托对象。 在您的.xib文件中,添加两个按钮。 将出口链接到您的PopUpViewController.swift文件。 我们将第一个按钮命名为“ optionAButton”,第二个按钮命名为“ optionBButton”。 目的是从您呈现的视图控制器中检测用户选择哪个选项。 让我们将呈现的视图控制器称为“ MainViewController”。 我们还将这个视图控制器称为我们的委托 。 我们将需要在两个班级之间进行交流-这是委派非常有帮助的地方! 第一步是创建一个协议。 什么是协议? 协议定义了一组功能,属性或其他要求以完成特定任务。 协议可以由类,结构或枚举所采用,而类,结构或枚举又将提供那些要求的实现,并且据说该协议符合该协议。 因此,基本上,协议定义了将委派的职责。 因此,回到我们的代码。 让我们在PopUpViewController.swift文件的顶部添加一个名为“ PopUpDelegate”的协议。 我们将在我们的协议中添加两个功能(认为是“责任”),我们的代表以后将实现这些功能。 它看起来像这样: 您可能会注意到,我们还在PopUpViewController上添加了proxy属性。 这样便可以通过我们的MainViewController对其进行访问。 稍后,您将看到MainViewController将PopUpViewController的委托分配给它自己。 接下来,让我们为两个按钮连接IBAction。 这里要记住的重要一点是IBAction会检测与PopUpViewController的用户交互。 一旦进入该函数,就让委托人知道我们正在调用委托方法。 现在,让我们回到MainViewController并实现我们的委托方法。 (提醒一下,这些方法是在我们的PopUpDelegate协议中定义的,并在我们的PopUpViewController中调用的。现在,该调用它们了,现在该决定做什么了 !) 首先,我们的MainViewController需要符合PopUpDelegate协议。 在类定义之后添加协议,编译器将给您一个错误,指出MainViewController类不符合PopUpDelegate协议。 所以,让我们修复它! 我们将添加PopUpDelegate协议中列出的两个函数。 现在,我们仅打印出已按下特定按钮。 我们仍然没有办法看到我们的PopUpViewController。 因此,让我们在MainViewController中定义PopUpViewController类并推送弹出窗口。 我们将在MainViewController上添加一个按钮,用户可以按下该按钮以显示弹出窗口。 然后,别忘了将PopUpViewController的委托分配给MainViewController的重要步骤! […]

React Native:刷卡,文本输入,动画和手势响应器

这周,我对React Native进行了第一次“认真”的尝试,发现一些令人惊讶的令人讨厌的东西,而文献记载却很少。 我希望这对其他人(或有更好解决方案的人)有所帮助。 让我们从刷卡开始 作为非iOS开发人员,我实际上不知道该模式的正确名称,Apple却喜欢将其命名为UITableViewRowAction。 不幸的是,React Native没有包含如此出色的现成解决方案。 由于缺少正式的解决方案,我跳到coach.js上,找到了希望有人已经编写的组件。 我选择与react-native-swipeout一起使用。 这是一个非常不错的图书馆简单图书馆,我或多或少开箱即用。 (注意:NPM版本已经严重过时,我最初只是使用NPM,但没有,只是使用了仓库) 从那以后,我就将它分叉了,用React Native LayoutAnimations替换了动画以减少依赖性(并且我想它会更高效),并且使手势处理对用户来说更加直观。 布局动画 LayoutAnimations是一个非常酷的库,它使您可以轻松地创建动画,并且或多或少都有文档记录。 您可以像这样创建漂亮的动画: LayoutAnimation.easeInEaseOut(); this.setState({elementHeight:1}); //确保它不为0! //设置元素的高度取决于this.state.elementHeight,我们都很好 但是请稍等,如果我将elementHeight设置为0会怎样? 看来React决定进行优化并完全删除元素而没有任何动画! 但是,如果我想完全隐藏该元素怎么办? hacky修复实际上还不错。 (您可以在GIF中看到它的实际效果)。 LayoutAnimation.easeInEaseOut(()=> { //完成动画后,将高度设置为0 this.setState({elementHeight:0}); }); this.setState({elementHeight:1}); 只需将动画设置为1px,然后在动画结束后将高度设置为0,使其消失即可。 这样,动画仍然可以正常工作,最后元素仍然可以完全消失。 TextInputs +滑动和手势响应器! 现在,我认为这是困难的部分。 该应用程序的部分需求当然是即使您在TextInput顶部开始滑动,也能够滑动出删除按钮。 默认情况下,如果点按了TextInput,它将“窃取”并“锁定”该手势至其自身,拒绝将其放弃给其他任何人。 如果您要在Swipeout中嵌套TextInput并期望Swipeout处理滑动,则这是个坏消息。 根本原因是什么? 这条线在这里。 那条线到底是做什么的? 好吧,这变得有些困难。 React Native中的大多数手势都建立在Gesture Responder系统之上。 当手势开始时,因此当您的手指第一次与屏幕接触时,它将找到“最深”元素,并询问是否要处理手势(使用onStartShouldSetResponder)。 TextInput总是要求处理输入(禁用时除外),就在用户第一次进行联系时(不知道此点击是否会变成滑动)。 现在,当用户开始拖动手指,并且手势响应器现在意识到这是“移动” /滑动时,它将再次询问元素是否要处理移动手势。 现在的问题是Swipeout想要处理移动手势,但是当Swipeout要求处理它时,手势响应器会询问TextInput(通过onResponderTerminationRequest)是否可以放弃对手势的控制。 由于某种原因,TextInput被编码为始终拒绝请求,因此我的Swipeout将永远无法处理TextInput内的手势。 手势响应器文档中的生命周期段落在手势操作中如何调用不同功能方面也非常全面。 同样的想法也适用于PanResponder(高级手势响应系统),如果您使用PanResponder,请参考GestureResponder的生命周期,因为它的本质是相同的。 […]

Swift 3.0:懒惰存储的属性,变量观察器,KVO(💤)

很快,概述一下Swift中需要了解和掌握的三个重要概念🔥许多人可能听说过惰性变量和键值观察,但是这些甚至意味着什么? 🤔我什么时候应该使用它们? 我应该注意什么后果或危险信号吗? 🛑 路线图🚗 路线图太棒了! 我认为不仅听力理论而且使用示例都具有重大价值💡对于每个主题,我都尝试包括一个基本示例和一个实际的制作示例💎 A.惰性变量 1. 什么 是一个惰性变量 2. 为什么 他们很重要 3. 如何 实施 4. 特别 笔记 5. 基本理论示例: 人员结构 uc 6. 实际生产示例: 化身 🤠 B.可变观察者🕵️ 1. 什么是变量观察者 2.关于计算属性的快速聊天🖥 3. 为什么重要 4. 如何实施 5. 特别说明 6. 基本理论示例:userStatusText🎮 7.实际制作示例: 游戏得分 👾 C.关键价值观察者(KVO)🔑 1. 什么是关键价值观察者 2. 为什么这很酷😎 3. 如何实施 4. 特别说明 5.实际的生产示例: 网页下载进度 👨‍💻 […]

自动将您的iOS代码签名文件上传到Bitrise

我们刚刚推出了Codesigndoc的更新,如果您使用它,您一定会感激的:我们添加了一个选项,用于将配置文件和证书上传到 Bitrise 。 到目前为止,我们仅导出了属于某个项目的配置文件和证书,但是您必须手动上传它们。 从现在开始,您也可以使用Codesigndoc上载它们,因此在导出后,我们会询问您是否要将导出的文件上载到Bitrise,从而为您节省了麻烦并简化了iOS代码签名。 在上传任何内容之前,该步骤将检查您要上传的文件是否已经上传以避免重复。 这意味着您不必记住已上传的文件。 💭 该功能使用Bitrise API(在此处了解更多信息),该API利用访问令牌对用户进行身份验证。 要为您的用户获取个人访问令牌,请在bitrise.io上与该用户登录,转到“帐户设置”页面,然后选择左侧的“安全性”选项卡。 向用户请求访问令牌(请参见上文)。 应用程序列表将从Bitrise下载。 您可以选择要为其上传导出文件的应用程序。 检查服务器上的重复项。 上载新的配置文件和证书。 我们希望您会喜欢Codesigndoc的新增功能! 建设愉快! 最初发布在 Bitrise博客上 。

移动先锋:iOS开发人员及其手艺

在2007年末,Apple Inc.诞生了移动开发的新玩家,该游戏自诞生以来就已经塑造了技术格局。 根本性的进步-称为iOS开发 -已经树立了一个基准,它在追随者和业务原则中保持了卓越的身份和完整性。 尽管Android开发无可争议,但iOS像滑坡一样,希望能够发挥关键影响。 关于所说的话,iOS开发已成为一个文化人物,具有其历代以来所获得的空前的公共价值,从而创造了自己的王朝。 此外,随着iOS开发人员在商业市场上赚钱,苹果公司为大规模就业做出了贡献。 史蒂夫·乔布斯 ( Steve Jobs)是该行业的两极分化人物之一,也是苹果公司的共同创始人之一。 史蒂夫·乔布斯曾经说过: “……周围的一切都是由比你聪明的人组成的。 您可以更改它; 你可以影响它。 的确,已故的影响者秉承了他的原则,后来通过包括小工具,电子元件,应用程序服务等在内的集体创新,成为了行业的先锋。最终,乔布斯和他的员工一起渗透了公众的身体需求和欲望; 导致策划苹果品牌的飞速成功。 一击接一击。 iOS与Android操作系统一起,彻底改变了人们的生活方式和技术观点。 凭借其创新的小工具,尤其是臭名昭著的iPhone,人们发现该小工具具有诱人的奢华感和便捷性,可以满足他们的需求。 因此,iOS的发展为市场上移动技术的发展做出了重大贡献。 为当今寻求重塑行业的iOS开发人员铺平了道路。 什么是iOS开发人员 iOS开发人员是一位移动专家,负责制定设计并开发适用于iOS移动设备的应用程序。 他们是技术专家,对iOS平台及其错综复杂的阶段有着复杂的掌握。 基本上,他们将对移动应用程序项目做出规定,并生成一个方便且可操作的iOS应用程序。 出色且用途广泛的iOS开发人员对用户界面 (UI)和用户体验 (UX)设计都有广泛的了解和实践。 通常,iOS开发人员最好精通一种以上的编程语言平台,即:Swift和Objective-C。 职责与承诺 构建和设计基于Apple iOS操作系统的创新应用程序。 在应用工艺创作之前,应先确定项目目标的策略。 与团队合作,获取有关设计,功能和原理的见解。 保障应用程序的性能,响应速度和质量,以提供出色的用户体验。 运行测试并在性能全面下降之前识别性能错误。 创新思想,评估性能并集成升级功能,以供将来的应用程序更新使用。 无论是简单的还是复杂的,都可以借助iOS开发人员来实现所需的iOS应用。 该过程可以是一系列的反复试验。 要使该项目成功,需要一个表达清晰,对细节有清晰认识的项目构想。 请记住,在此过程中可能会不可避免地遇到障碍。 但是,通过与您的iOS开发人员之间的紧密合作,项目的繁荣将是至关重要的,这不仅会使您受益,而且也会使那些期待创新的人们受益。 最初于 2018年3月9日 发布在 www.blueprintbusinesssolutionscorp.com 上。

在连接的控制器中处理键盘事件

最近几个月,我们一直在开发Storgage应用程序(尚未在App Store上),并且我们希望分享开发该应用程序时使用的一种技术。 问题 我们应用程序的功能之一是使用内置的即时消息传递服务,以便用户彼此交谈并查看交易历史记录详细信息。 屏幕的设计如下所示: 如您所见,聊天区位于屏幕底部,当用户点击“键入消息”时,弹出系统键盘将其覆盖。 解 我们决定,当系统键盘弹出时,应显示一个动画的“键入消息”输入字段,并且应将聊天区域推到屏幕顶部。 退出键盘后(通过点击聊天区域或“发送”按钮),屏幕应返回其原始状态。 这是我们要实现的行为的示例: 问题二 在这一点上,我们面临另一个问题。 消息传递控制器是主屏幕控制器的子级。 家长必须将聊天窗口扩展到全屏状态,我们必须告诉它何时进行。 解决方案二 我们使用委托模式来通知父控制器键盘的出现和消失,以便可以正确地定位内置消息传递控制器。 实作 Storgage项目是用Objective-C编写的,但是为了更好地展示本文中的问题的解决方案,我们将创建一个用Swift编写的示例项目。 首先,让我们创建一个空的“ Single View Application”项目。 将其命名为“ ChildControllerKeyboard”,然后选择Swift作为语言。 然后添加两个类:从UIViewController继承的ContainerViewController和ChildViewController。 为此,请从菜单中选择文件>新建文件…。 然后从弹出窗口中选择“ Cocoa Touch Class”,并使用相应的值填充字段。 对ChildViewController重复上述步骤。 然后可以删除ViewController.swift文件。 现在切换到Main.storyboard并将控制器类从ViewController更改为ContainerViewController。 向主控制器的内容添加视图 将对象库中的视图对象放到控制器上,并设置以下约束,将其附加到屏幕边缘,并将高度设置为等于屏幕的一半: 尾随空格为:Superview = 0 前导空间:Superview = 0 最多空间:Superview = 0 等于以下高度:Superview = 0,Multiplier = 0.5 在“身份检查器”选项卡的“标签”字段中输入值“内容视图”,然后在“属性”检查器选项卡上将“背景”值更改为“浅灰色”。 最后,我们的控制器应如下所示: 添加子控制器 将来自对象库的“容器视图”对象放在控制器上“内容视图”下方,并设置以下约束,并将其附加到屏幕和“内容视图”的底部: 尾随空格为:Superview = […]

Swift,Xcode 8.1,NSTableView,绑定和数组控制器

从iOS开发转向macOS开发时,您理所当然的一件事就是iOS中的表格清晰明了。 UITableViews真正构成了许多iOS体验的骨干-明确定义了与它们的交互,并且对其进行了很好的记录和教导。 macOS和NSTableViews并非如此! 最初,我的印象是,就像在iOS上一样,将只有一种“正确”的方式来制作表格。 但是,在代码内实现和绑定之间,我感到困惑和迷茫。 这篇文章将通过使用绑定对NSTableView进行非常基本的设置。 有很多注释和屏幕截图,特别是因为要管理的屏幕太多….好吧,让我们深入研究! 第1步:准备数据模型 这里没有超级幻想。 让我们从PONSO开始。 类SomeDoctor:NSObject { var variable1:Int = 0 var variable2:Int = 0 var variable3:Int = 0 } 在上面,我们要做的就是创建一个NSObject并实例化一些变量。 请注意这些变量名,因为稍后我们将直接绑定它们(按名称)! 第2步:设置您的NSViewController 再次,这里没有幻想。 让我们创建典型的NSViewController,但是这次要注意创建一个动态类型的数组,如下所示: 类SimultaneousSummaryViewController:NSViewController { … @IBOutlet var arrayController:NSArrayController! 动态var临床医生= [SomeDoctor]() … } “动态”在这里只是意味着编译器将退出并寻找合适的Objective-C编译器来实现。 您可以在此处阅读有关该想法的更多信息。 当我们在这里时,我们还创建了一个NSArrayController引用-这是可选的! 我们严格不需要任何东西,但是制作完成后,您可能会感到不舒服。 步骤3:建立您的NSArrayController 找到您的NSArrayController对象,然后将其拖放到情节提要或xib文件中的NSViewController中。 步骤4:绑定,绑定,绑定! 突出显示您刚刚创建的NSArraryController。 展开右侧面板,然后选择“绑定”选项卡 展开后,请尝试使以下参数与您所拥有的匹配。 在上面,我们所做的是将NSArrayController绑定到NSViewController(明确地)。 现在,我们还将其绑定到我们先前定义的变量,并使该变量可用。 步骤5:绑定您的NSTableView 我们到家了! 将NSTableView拖放到情节提要/ […]

查看Swift中的装饰

本文适用于开发人员,iOS爱好者以及在确保移动应用程序中的视觉连贯性方面遇到挑战的任何人。 让我解释。 有时,您的移动应用程序中不同类型的元素具有相同的外观,对吗? 他们是连贯的。 通常,实现此目标是有代价的:您最终编写了许多行重复的代码,希望这样做不会使所有内容的可维护性降低,并且在需要时也很难进行更改。 一种可能的解决方案: 常量 。 正确分组并正确使用常量可以解决不一致问题,但是可维护性和代码简单性不会显着提高。 一定有另一种方式…… 在尝试找到一个简单,优雅的解决方案时,我想到了一个接口,该接口定义了一个入口点,用于在整个应用程序中自定义UIKit元素。 这个概念称为ViewDecorator 。 模式的核心是通过以下协议定义的,描述了装饰器对象的行为: 通过将外观包含在这些分隔符对象中,可维护性和可读性得到提高,重复代码行减少了。 想象一下,在更名的情况下修改组件的样式有多么容易。 😄 访问UIView子类的属性 由于协议采用特定的UIView类型,因此在尝试自定义特定的UIView子类属性时可能会遇到问题。 一种可能的解决方案可能是将视图实例转换为decorate(_ view: UIView)内的预期类型,但这会搞乱单一职责原则,并使其在不同种类的实例上的行为有所不同。 相关类型进行救援! 让我们看看装饰器对象如何变化: 很整洁吧? 我很高兴听到您对这个解决方案以及我可能没有想到的有趣用例的看法。 您也可以转到我的博客以获取更多文章。

iOS的调查见解..第2部分

如果您错过了第一部分,这是iOS开发人员调查分析的第二部分。 该调查的目的是收集信息和反馈,并使用此数据作为该杂志上未来帖子的输入。 Q6,您最喜欢iOS上的什么? 这个问题是关于寻找什么使iOS变得有趣而又出色的原因,尽管没有人能真正捕捉到使用iOS的整个过程,但毫不奇怪,迅捷是赢家! 新语言以惊人的速度进入了平流层,是有史以来最快的采用率之一。 关键见解 如果您还不迅速,那就落后了! 它不仅有趣且直观,而且在许多方面使我们的工作“更加轻松”。 谁曾在objc中写过一个块,谁也不会同意。 有一个关于它的整个网站,迅速,另一方面是美丽而富有表现力的。 Q7和Q8,您对iOS的需求如何? 现在让我扮演魔鬼的拥护者,说还有很多地方需要改进,而且将一直如此,这就是使事情向前发展的原因,一次总有好有坏。 缓慢的Xcode构建和Apple Sign /分发过程是预期的主要抱怨来源。 关键见解 尽管情况有所好转,并且每年都在改善,但仍然存在一些痛点,有些问题可以使用Fastlane等出色的工具来处理。 其他一些诸如缓慢的xcode构建(尤其是在大型项目中)则比较棘手。 人们采用迦太基而不是Cocoapods,这是一个了不起的工具,在某些情况下已经看到了改进,尽管至少在我看来,Cocoapods仍然是目前的最佳选择。 尽管如此,尽管如此,我们仍然希望Apple节省一天的时间,缩短下一个Xcode版本的构建时间。 问题9和问题10,路线图? 问题九和十是很重要的,这些是我一直在寻找的答案,这些答案最终将帮助我利用我自己的观点和品味为该杂志开发新内容。 结果显示出非常有趣的方面: – 持续集成| 交付 (*如何改善当前的工作流程,例如采用fastlane之类的工具) – 测试,模拟和存根 (*如何在iOS上编写测试。模拟,存根,视图控制器测试,UI测试) – RxSwift和反应式编程 – 适用于iOS开发人员的 草图 关键见解 这种见识比我的要多得多,可以从这篇文章中分享和借鉴,但是从这里获得的教训是,本出版物的下一篇文章将首先尝试回答并满足这些需求。 结论 希望大家喜欢这个系列,根据这个反馈,我开始了一个旨在传达所有这些信息的项目。 该项目将为一系列帖子提供输入,这些帖子将从下周一开始发布。 与往常一样,任何想法,疑问或反馈都值得欢迎。 =)