Tag: iOS应用程序开发

您是否了解与iOS App开发相关的准则?

无论您是iOS应用程序开发领域的新手还是一支经验丰富的专业人员团队,都希望创建更多应用程序,请确保在开始开发旅程之前,您已经非常熟悉这些准则。 但是,如果您不了解这些准则,请不要担心,因为我们在这里可以帮助您理解这些准则。 iPhone App开发指南 尽管应用程序开发人员应遵循许多准则,但我们将所有准则汇总在一起,并在3个主要主题中列出了这些准则: 1.发展方针 2.设计准则 3.营销准则 通过对指南的详细说明,进一步解释了所有3条指南部分。 进一步阅读以了解更多信息。 — https://goo.gl/vNu65K

Xcode的安全区域

当视图在屏幕上可见时,本指南将反映该视图未被其他内容覆盖的部分。 视图的安全区域反映了导航栏,标签栏,工具栏和其他祖先覆盖的区域,这些区域使视图控制器的视图变得模糊。 (在tvOS中,安全区域合并了屏幕的边框,如UIScreen的overscanCompensationInsets属性所定义。)它还覆盖了视图控制器的overscanCompensationInsets属性所定义的任何其他空间。 如果视图当前未安装在视图层次结构中,或者在屏幕上尚不可见,则布局指南始终与视图的边缘匹配。 对于视图控制器的根视图,此属性中的安全区域表示被遮盖的视图控制器内容的整个部分,以及您指定的任何其他插图。 对于视图层次结构中的其他视图,安全区域仅反映该视图中被遮盖的部分。 例如,如果视图完全在其视图控制器的根视图的安全区域内,则此属性中的边插入为0。 根据苹果的说法, Xcode 9 —发行说明 Interface Builder使用UIView.safeAreaLayoutGuide代替了UIViewController中已弃用的顶部和底部布局指南。 要使用新的安全区域,请在文件检查器中为视图控制器选择“安全区域布局指南”,然后在内容和新的安全区域锚点之间添加约束。 这样可以防止您的内容被顶部和底部的条以及tvOS上的过扫描区域所遮盖。 部署到早期版本的iOS时,对安全区域的约束将转换为“顶部”和“底部”。 这是现有(顶部和底部)布局指南和“安全区域布局指南”之间的比较(以产生类似的视觉效果),仅供参考。 自动版式 如何使用安全区域布局? 请按照以下步骤查找解决方案: 如果未启用,请启用“安全区域布局”。 如果它们显示与Super View的连接,则删除“所有约束”,然后使用安全的布局锚点重新附加所有约束。 或双击约束并编辑从超级视图到SafeArea锚点的连接 这是示例快照,如何启用安全区域布局和编辑约束。 这是上述更改的结果 使用SafeArea进行布局设计 为iPhone X设计时,必须确保布局充满屏幕,并且不会被设备的圆角,传感器外壳或用于访问主屏幕的指示器所遮盖。 使用标准的,系统提供的UI元素(例如导航栏,表格和集合)的大多数应用会自动适应设备的新尺寸。 背景材料延伸到显示器的边缘,并且UI元素已适当插入和放置。 对于具有自定义布局的应用程序,支持iPhone X也应该相对容易一些,尤其是如果您的应用程序使用自动布局并遵守安全区域和边距布局指南。 这是示例代码(请参阅: 安全区域布局指南 ) : 如果您在代码中创建约束,请使用UIView的safeAreaLayoutGuide属性获取相关的布局锚点。 让我们在代码中重新创建上面的Interface Builder示例,以查看其外观: 假设我们在视图控制器中将绿色视图作为属性: 私人让greenView = UIView() 我们可能有一个函数来设置从viewDidLoad调用的视图和约束: 私人功能setupView(){ greenView.translatesAutoresizingMaskIntoConstraints =否 greenView.backgroundColor = .green view.addSubview(greenView) } 像往常一样使用根视图的layoutMarginsGuide创建前缘和尾缘边距约束: 让margins […]

Unity:处理来自多个源(控制器,键盘等)的输入

喜欢这个职位吗? 您可能会喜欢 BentoBlox 也可以-在 App Store 上查看游戏 。 本周,我将为一款旨在在多个平台上运行的游戏制作原型。 核心挑战之一是预期和处理来自各种不同来源的用户输入。 我的初始方法依赖于Observer-Subscriber模型:单例UserInputDeviceManager存储对当前连接的输入设备(控制器,键盘等)的引用,并在Update上轮询该设备的按钮,以确定是否有任何按钮位于按下状态: 公共类UserInputDeviceManager:Singleton {public UserInputDevice currentUserInputDevice; 公共UserInputDevice []支持的UserInputDevices =新的UserInputDevice [] { 新的XBoxOneController(), 新的PS3Controller(), 新的DualShock4Controller(), 新的KeyboardController() }; 重写受保护的void Awake() {base.Awake(); SetupCurrentUserInputDevice(); }私人无效SetupCurrentUserInputDevice() { currentUserInputDevice = System.Array.Find(supportedUserInputDevices,m => m.IsConnected()); } void Update() { currentUserInputDevice.PollButtons(); }} 在PollButtons ,每个UserInputDevice广播处于按下状态的任何按钮的事件: 公共无效PollButtons() { ArrayList按钮= new ArrayList(); button.Add(JumpButton); button.Add(ConfirmButton); button.Add(PauseButton); button.Add(DPad.LeftButton); button.Add(DPad.RightButton); button.Add(DPad.TopButton); […]

迅速—微调器

2.单击其所在的指示器视图,然后选中“属性”检查器中的“停止时隐藏”复选框,如下所示。 3.将带有相应指示器的IBOutlet连接到控制器文件。 @IBOutlet变量微调框:UIActivityIndi​​catorView! 4.将UIWebViewDelegate协议添加到该类,并通过在viewDidLoad方法的顶部插入以下代码来注册委托。 类DetailViewController:UIViewController,UIWebViewDelegate { …。 覆盖func viewDidLoad(){ Self.webView.delegate =自我 // webView是WebView的IBOutlet名称 } 5.最后,在加载页面时,可以在加载失败时插入操作。 Func webViewDidStartLoad(webView:UIWebView){ //当WebView开始加载页面时 Self.spinner.startAnimating() } Func webViewDidFinishLoad(webView:UIWebView){ // WebView完成页面加载后 Self.spinner.stopAnimating() } Func webView(webView:UIWebView,didFailLoadWithError错误:NSError?){ //当WebView无法加载页面时 Self.spinner.stopAnimating() }

圣地亚哥离合器最佳移动应用程序开发人员评论

移动平台既代表着独特的机遇,也代表着独特的挑战。 独特的机会是为不同行业创建具有不同概念的移动应用程序,以吸引渴望利用公司产品和服务的目标受众,而独特的挑战是设计和开发具有最佳用户体验的定制应用程序,以留住这些用户。 选择移动应用开发机构之前,您应该先进行头脑风暴会议来决定; 您在应用程序中寻找什么? 谁是您的目标受众? 谁是您的竞争对手? 您想在应用程序中添加哪些功能? 确定要求后,就开始为梦想的项目搜索最佳的移动应用程序开发合作伙伴。 由于市场上有许多应用程序开发人员,因此很难选择最好的应用程序。 您如何确定这家公司是最好的移动应用开发公司? 您考虑过哪些关键因素? 他们的应用程序是否可扩展? 强大的? 有多受欢迎? 该应用程序是否能够创造出色的用户体验,用户界面和直观的本质? 根据我的研究,公司的投资组合/客户群以及对离合器的评价,我已经编制了旧金山最佳移动应用程序开发人员名单。 您可以看一下圣地亚哥的一些优秀的移动应用程序开发人员,如下所示: Seamgen成立于2008年,旨在解决技术和设计方面的复杂问题。 目前,他们通过聘用我们能找到的最有才华的人才,并通过蓬勃发展所需的工具和关系将他们插入环境中来实现这一目标。 最小项目规模:75,000美元以上 平均时薪:$ 100 – $ 149 员工人数:50–249 AppClues Infotech是英国,美国,加拿大和印度最好的UI / UX设计,移动应用程序开发机构之一,专门从事移动应用程序创新和策略。 我们将它们集成到成熟的业务解决方案中,为您的公司建立强大的在线形象并最大程度地提高您的投资回报率。 最小项目规模:10,000美元 平均时薪:$ 15- $ 99 员工人数:25–99 BitCot是一家屡获殊荣的全方位服务应用程序开发公司,专门为财富500强企业的初创公司开发出色的移动/网络应用程序。我们是一个由40名工程师/设计师组成的团队,对应用程序和发展充满热情。 我们以创造价值创造业务和消费产品为荣。 最低项目规模:$ 5,000 + 平均时薪:$ 25- $ 49 员工人数:10–49 感谢您阅读本文,希望对您有所帮助。

移动开发人员pt.2的无尽痛苦

最初发布在我的博客上 安装Usergrid。 您最好使用RTFM,并在2017年6月使用该手册将我的故事视为对我的冒险的一组评论。 Usergrid Stack是一个在Tomcat上运行的Java EE Web应用程序,使用Cassandra数据库进行存储,并使用ElasticSearch搜索引擎进行查询。 在将Usegrid Stack安装到Tomcat之前,您将首先设置数据库和搜索引擎节点。 首先,您需要Cassandra。 出于存储目的,我设置了一个单独的Ubuntu实例,该实例将成为Cassandra单节点群集。 设置很简单,并在Cassandra官方文档或数字海洋教程中进行了介绍(它们似乎更加时髦) 下一步是弹性搜索 再次,我使用了数字海洋教程 与Tomcat相同。 Usergrid似乎需要Tomcat 7或更高版本,这就是为什么我决定尝试8并看看会发生什么的原因。 立即我遇到了usergrid config的问题。 似乎在部署到tomcat的过程中没有拾取配置文件usergrid-deployment.properties 。 无论我将它们放在文档所说的位置还是遵循互联网上的各种建议。 它既没有与elasticsearch也没有与cassandra连接。 互联网上有几个与此问题有关的问题以及一些可能的解决方案: 您自己和用户网格从源进行构建可能会开始获取配置。 自己从源代码构建,并替换默认配置文件。 上帝保佑Java开发人员,从源代码进行构建并不痛苦。 除了构建文档中未提及的4行: cd ~\usergrid\sdks\java mvn install cd ..\..\stack mvn install -DskipTests=true 好。 更详细地查看日志表明,即使在我重建之前,如果它们位于…。/ tomcat / lib /中,它也确实会拾取配置。 =( 我的Cassandra节点和usergrid后端位于不同的实例上,并且在抽出更多日志之后,事实证明问题出在Cassandra配置中,并且是绑定地址。 但是尽管如此,我还是学会了如何构建usergrid,现在该起飞了! 还没。 同样,usergrid无法在Tomcat下启动。 我决定擦除Tomcat8并尝试使用Tomcat7。 而且有效(!) 下一个问题是在Elastic Search中。 日志显示连接尝试异常。 我重新安装了usergrid docs中相同版本的ES:1.7.2,而不是最新的5.4.xо_О […]

JSON编码和解码– Swift 4

Swift 4中JSON编码和解码的简短详细介绍 Swift 4为我们提供了一种新的且更轻松的JSON处理方式。 假设我们创建了一个使用用户个人资料的应用程序。 在.get请求之后,我们收到了一个人。 让我们创建它的结构: 现在,我们可以创建Struct的实例并打印其数据,以确保它是我们的正确实例: 如果我们需要在Swift 4中将我们的person实例表示为Data ,则可以在一行中完成: 想象一下,您必须以JSON表示形式在服务器上发送此实例,如果首先拥有实例,则必须将其转换为Data类型,然后可以创建JSON: 如果您收到的人是JSON,并且需要先将其转换为struct实例,则必须先将其转换为Data ,然后再将其转换为struct : 上面的代码看起来不太易读,但我想向您展示确切的步骤流程,您可以在上面的要点中轻松看到它。

将Kitura Swift应用程序部署到IBM Bluemix

当寻找将Kitura Swift应用程序部署到Bluemix的选项时,您可能会跨IBM Cloud Application Tools运行。 IBM Cloud Application Tools提供了一个Mac应用程序,该应用程序可以帮助您将应用程序部署到Bluemix服务器。 不幸的是,我对IBM Cloud Tools并没有积极的经验,因为它一直处于冻结状态,无法将我的应用程序上载到服务器。 在对IBM Cloud Application Tools感到失望之后,我转向了命令行工具。 IBM在Github上提供了一个入门项目,他们在其中讨论使用终端进行部署的过程。 不幸的是,他们错过了很多步骤,目前尚不清楚如何成功进行部署。 希望这篇文章将列出执行到IBM Bluemix的部署所需的所有步骤。 让我们从一个名为“ Hello-Pokemon”的简单Kitura项目开始。 Package.swift文件对Kitura存储库具有单个依赖性,如下所示: 在main.Swift项目中,创建一条返回Pokemon名称的单一路线,如下所示: 如果访问URL http:// localhost:8090 / pokemon,您应该看到“皮卡丘”显示为返回的文本。 这对于我们的实现来说就差不多了。 让我们将其部署到Bluemix。 第一步是在Bluemix上创建一个帐户。 您可以访问Sign Up for IBM Bluemix页面来创建一个免费帐户。 请注意,Bluemix最多可以免费使用30天。 在使用您的凭据创建金额“ Login ”之后。 成功登录后,您将进入“ 仪表板”屏幕。 点击“创建应用”按钮开始使用。 下一个屏幕是模板选择屏幕。 向下滚动并在Cloud Foundry Apps下选择“ Swift运行时 ” 。 提供应用程序的名称,然后单击“创建”按钮,如下所示: 单击“创建”按钮后,将带您进入“入门”屏幕,其中将列出部署该应用程序所需执行的所有步骤。 为了使用命令行部署应用程序,请确保已安装Cloud Foundry […]

带有枚举的Nifty,Bug-Safe URL

这是一个分为四部分的系列文章的第二篇,该文章名为: Nifty,Swifty,API支持的App 。 您可以在 此处 分叉最终项目 。 第1部分:具有GitHub Pages的Nifty静态内容托管 第3部分:具有可分解功能的漂亮自构对象 第4部分:带有NSCache的漂亮的自动缓存ImageView 介绍 在上一篇文章中,我们设置了静态内容宿主,并在Xcode项目中创建了一个非常简单的APIService,下载了一些json内容。 调用下载json的方法如下: 我们可以在第一行看到传递的字符串相当长,这是在根目录中获取数据。 想象一下,当我们导航到层次结构中更深的文件时,字符串将得到多长时间! 显然,URL路径越长,我们的代码就越容易受到拼写错误的影响。 在本文中,我们将创建一个枚举,以最简单,最安全的方式处理所有文件路径。 创建URL枚举 在我们的应用程序中,URL将仅由我们在上一篇文章中构建的APIService使用。 因此,有意义的是,处理我们不同的url大小写的枚举位于同一实体中。 这是我们的两种情况: 您会注意到baseURL存在于枚举之外,这在每种情况下都是必需的(第3行) 。 我们的枚举有两个变量: path (第9行)和url (第16行) 。 这是因为我们要使用字符串构建路径,然后使用该路径来初始化我们的URL。 注意,在url结构(第18-19行)中 ,我们可以简单地调用self.path来获取所需的字符串。 因为objectData.json是我们唯一需要的根文件,所以其路径构造非常简单(第11行) 。 另一方面,获取我们的图像需要一个图像文件名作为关联值,作为我们的终点。 要提取关联的值并将其用于我们的字符串构造中,请使用let (第12行) 。 使用URL枚举 现在,我们可以将输入参数更改为新的APIURL类型,而不是将冗长的字符串传递到fetchData方法中。 文件1:在方法定义中,我们以枚举形式作为输入参数,因此我们需要使用apiURL.url (第3行)来获取URLSession的url。 文件2:现在,当我们可以调用方法时,可以使用非常简单的点表示法.json (第1行) 包起来 这就是每次提供安全网址的简单程度! 使用具有关联值和计算变量的枚举非常强大,并且可以最大程度地确保您的URL可以正常使用,从而使您可以灵活地获取所需的任何端点。 请单击此处阅读第3部分: 具有Decodable的Nifty自构造对象 ,在这里我们使用json安全构建对象并且没有疯狂的解析。 谢谢阅读!

具有可腐烂性的漂亮自构物体

这是一个分为四部分的系列文章的第三篇,该文章名为: Nifty,Swifty,API支持的App 。 您可以在 此处 分叉最终项目 。 第1部分:具有GitHub Pages的Nifty静态内容托管 第2部分:带有枚举的Nifty Bug-Safe URL 第4部分:带有NSCache的漂亮的自动缓存ImageView 介绍 在上一篇文章中,我们使用错误安全的网址获取了json数据。 现在,我们想使用该数据为我们的项目创建Person对象。 我曾经使用JSONSerialization来执行此类任务,它将根据输入的json数据生成一个字典。 构造所需的对象将需要遍历字典中的每个键,将值向下转换为所需的类型,然后将其分配给对象中的适当属性。 这很费力,并且容易出错,因为您必须键入每个键。 幸运的是,这现在是从json实现对象创建任务的“老方法”,并且现在有了Decodable协议,它非常安全且易于实现。 用可解码初始化对象 让我们从以下位置的json开始:https://timmybea.github.io/StaticHostingDemo/objectData.json 您会注意到,我们有一个键“ person”,其中包含一个数组json对象,这些数组包含我们的人员数据。 因此,让我们由内而外地进行工作,并从构造我们的Person对象开始: 我们的对象仅对json中的每个人信息都有一个属性。 现在我们可以遵循Decodable ,为我们的解码器创建密钥并设置我们的init方法。 在此代码中,我们遵循Decodable (第1行)的要求 ,并为我们的编码键(第9-15 行)创建一个枚举。 请注意,枚举类型必须为String并符合CodingKey协议。 对于每种情况,我们都分配与json键匹配的原始值。 接下来,我们实现协议初始化程序init(来自解码器:) (第17–27行)。 这涉及到使用.container(keyedBy 🙂 (第18行)将保存我们数据的解码器转换为KeyedDecodingContainer ,然后使用.decode(type :, forKey :)将每个键处的数据解码为所需的数据类型。 这些方法中的每一个都是失败的,因此初始化器被标记为throws,并在后台处理。 最后,我们调用成员明智的初始化程序,以使用成功向下转换的类型(第26行)构造我们的实例。 重要的是要确认,如果您的属性名称与json键的属性名称匹配,则只需要创建一个匹配的CodingKey即可快速神奇地构造您的实例,而无需定义初始化程序。 由于json通常不会采用这种方便的格式,因此此演示演示了完整的构建过程。 解析JSON 我们已经处理了Person实例的创建,但是请记住,所有person数据都可以通过json键“ person”访问 。 那么我们如何解析json来检索对象呢? 答案很简单:与上一节完全相同。 请注意,这一次我们只有一个[Person]类型的属性。 我们遵循与上一个示例完全相同的步骤,遵循Decodable […]