挑战#1(11/02/2018)

这是我们所面临的挑战,涉及使用“ Swift应用程序开发简介”这本书,我们将按照第17章中给出的说明来制作一个应用程序。 我们的代码包含3个部分,它们很容易解释,但是在代码中做起来有些棘手。 这三个部分如下: 第一部分是3个开关,它们的功能是为屏幕顶部的框赋予颜色。 每个开关在其打开的图案中都赋予不同的颜色。 例如,如果第一个开关打开,而另两个开关关闭,则该框的颜色将为红色,依此类推,每种组合都会给出不同的颜色。 第二部分是3个滑块,它们的功能是为打开的开关赋予不同的色调。 例如:所有开关均处于打开状态,并且滑块具有不同的值,并且框的颜色将是这些颜色的组合。 另一个示例是,当开关打开且滑块具有最大值时,框的颜色将为白色。 (供参考,见附图) 该应用程序的最后一部分是重置按钮,它的功能是将应用程序重置为关闭开关,并将滑块设置为其默认值,并将该框保留为其原始颜色(黑色)。 所有的开关和滑块都是彩色的,因此用户可以轻松地确定盒子对什么起作用。 奥斯卡·雷娜(Ascar Reyna)A01570385 安德里亚·洛萨诺(Andrea Lozano)A01570415

重新设计Apple Music – Justin Latham –中

在过去的两年中,我花了很少的时间来慢慢设计和重新设计我认为完美的音乐订阅应用程序的外观。 一直以来,我逐渐建立了对Sketch和Photoshop的了解,以帮助构建像素完美的菜单。 当我听说Apple Music将要获得全新的油漆时,我很高兴看到更改会带来什么。 虽然新外观肯定比原始外观有很大的提高,但是第一个Beta版中存在一些明显的遗漏和问题,这些使我一开始措手不及。 首先是……的大小……嗯,所有东西。 字体不仅比旧的iOS 9版本大,而且重量也大得多。 在系统级别,iOS 10与iOS 7的设计语言和准则有很大不同。 我们首先将它们全部删除。 虽然我坚信Dieter Rams的《十项优良设计原则》,但我觉得有一个规则被遗漏了。 好的设计是一致的。 它应该毫不夸张,创新,有用,在美学上令人愉悦,诚实,持久,在环境上可持续,易于理解并且尽可能少地设计。 当在多个应用程序和设备上使用多种功能,菜单和显示时,一致性是关键。 因此,让我们从其他Apple设计中获取一些资产,并开始为用户创建一致的体验。 苹果似乎弯腰离开了iOS 7的旧分段控件,您知道吗? 真的没关系 尽管它适用于iOS的其余部分,但也存在明显的缺陷。 它无法适应具有多个细分受众群或更多细分受众群的应用。 我们将从Apple自己的支持网站上截取上面的屏幕截图。 这是一个清楚的例子,说明了为什么旧的分段控件不能对所有内容都起作用。 苹果可能正计划在新的音乐应用程序中更改分段控件,但目前尚不存在。 图书馆 尽管我并不喜欢每次查看音乐时都添加一个额外菜单的想法(我几乎没有使用过除Artist(艺术家)视图之外的任何其他视图)的想法,但我可以理解它们为何朝这个方向发展。 在获得触摸屏之前,它实际上使人想起了iPod的旧iPod接口。 对于长期使用Apple产品的人来说,这是简单而又熟悉的。 为了适应较早的设计准则,我对字体进行了一些减少,并在菜单结构旁边添加了图标,但对我来说最大的不足是最近添加的字体。 很多时候,您想查找最近添加到库中的内容。 我已将它们放在菜单顶部的首位,这样您就可以快速地水平滑动以匹配应用程序内的其他部分。 艺人 在“搜索”选项卡下搜索歌手时,您会在iOS 9的“音乐应用程序歌手”页面中看到“全部”部分的新外观。 它具有歌手的英雄图像,最新发布的歌曲,热门歌曲,视频等。当您进入图书馆并选择歌手时,它将显示旧应用程序歌手页面的“我的音乐”部分。 两者非常明显地(而且个人而言很烦人)分开。 重新设计Artist页面时,我从多个应用程序的旧界面和新界面的各个方面产生了影响,从Health应用程序中的英雄图像到Music的较旧的Artist Page部分,甚至是Apple的支持网站。 页面顶部的英雄图像和徽标为演出者提供了一些个性,然后将演出者页面分为三个区域: 全部,我的音乐和连接。

TDD是“落后”

在向同事教授TDD时,经常会出现相同的问题: 我们从哪里开始开发软件? 这个问题导致了很多讨论和理解TDD的艰辛。 我看到了从哪里开始的不同方法,但是大多数情况下,人们倾向于使用用户界面。 这样做的原因是能够执行交互并查看他们是否实现了正确的行为。 在TDD中执行此操作非常繁琐。 您从一个按钮开始,然后检查它是否为nil。 好的,是这样……按下按钮时,我想查看用户搜索的电影列表。 嗯,我还没有测试,因为我还没有任何数据! 该怎么办? 一种选择是传入伪数据,并在每次添加一些代码时将其逐段替换为实际数据。 这似乎很好,直到您意识到需要大量工作并且开发速度缓慢。 另一种选择是不以用户界面开头。 而是从网络请求开始。 从这里开始,您的测试将确切知道预期的内容并正在测试实时数据,而不是模拟(当然,下一步是对请求进行存根,但我们还没有完成)。 编写完请求后,我们可以添加解析,然后可以添加存储等。通过这一切,我们知道我们拥有的工作代码不基于假设。 自下而上的一个问题是股东。 他们希望看到您软件中的更改,而他们看不到创建网络堆栈。 不要陷入模拟所有数据并仅创建用户界面以使股东满意的陷阱。 在某个时候,您将不得不编写其余的内容,然后他们将抱怨更多,因为开发速度很快,现在没有新内容了。 除了默认的TDD做法,这没什么别的主意: 从您所需的最小代码开始,并为此编写测试。 结论 让这个主意变得不那么容易。 它要求纪律首先编写测试,而不添加不必要的代码。 仍然遵循这一纪律并坚持下去将会产生巨大的成果,上面所写的想法只会帮助您入门。 实践TDD本身将得出这个结论。 如果不是这样,我很想听听! Next:Swift中的高级模拟 上一篇:联网怎么样?

目标C:属性属性

Objective C属性,Objective-C中最困难的部分。 很多时候,即使是开发人员,甚至是StackOverflow,都让您在何时需要使用哪个属性时陷入困境。 最终,随着ARC(自动引用计数)出现在市场上的岁月,iOS中的内存管理得到了改进,在该市场中,我们无需为对象释放后定义的所有对象进行dealloc和deinit定义。 ARC版本的内存管理的发布使iOS中的开发变得更加容易,并且内存泄漏等情况会自动得到多次处理。 我们将在这里讨论的主要目标C属性是: 强:强是保留的新形式。 到iOS 4为止,我们一直使用retain代替strong 。 Strong仅定义对象的所有权。 对象的生命周期将一直保留,直到所有者本身未取消分配对象为止。 我们通常对对象的父级使用strong ,即在UI Elements的情况下,对UIViewController使用strong 。 保留:保留还拥有object属性。 在一般情况下,当我们要为同一对象使用新的设置器时,如果要删除先前的值,则使用保留 。 弱:弱只是一个指针,仅在对象由某个强大属性拥有时才起作用。 我们通常使用弱以避免保留周期。 保留周期仅表示如果A强烈指向B,B强烈指向C,并且在任何情况下C似乎也强烈指向A,那么它将在所有A,B,C属性之间产生死锁。 为了避免保留周期,我们通常使任一过渡都变弱,而不是强过渡。 弱属性通常与IBOutlet,Delegates和其他Objective-C参考一起使用。 分配:分配是弱属性的旧版本。 到iOS 4为止,我们一直使用分配代替弱属性。 Assign主要用于基本数据类型,例如int,float等。 原子:在线程安全的情况下,原子属性是默认属性,但可以用nonatomic覆盖。 原子属性定义属性是线程安全的,并且将始终返回真实值。 垃圾值的可能性是最小的。 由于它是线程安全属性,因此比其竞争对手nonatomic花费更多的时间执行。 NonAtomic:NonAtomic属性不是线程安全的,不能保证结果真实,但始终会给出结果。 简单的情况就可以理解,如果A将B设置为“ Srijan”,而C将B设置为“ Kumar”,则D可能会想要D获得B的值,这可能会产生类似“ Srimar”或“ janKum”,但非原子总是给出结果。 因为它不是线程安全的属性,所以它比atomic快。 对于几乎是类的对象,我们盲目使用非原子。 ReadOnly:顾名思义,readonly属性增强了该属性的接口,即其他对象只能读取该属性,而不能设置该属性的值。 我们使用只读,不想让其他类设置属性的值。 读写:这也是默认行为。 一旦你合成了一个属性,它就可以对该属性进行获取和设置。我们只需在实现模块中编写@synthesize即可 。

设计模式—创新模式— Swift中的工厂模式

作为一名崭露头角的计算机科学家,您无疑已经听说过课堂和学习途径中的设计模式。 设计模式是蓝图,概述了创建可重用的面向对象代码,解决常见软件问题的最佳实践。 为了避免给您带来长期的历史教训,我将描述设计模式的起源可以追溯到1970年代,但是随着1994年发布并由Erich Gamma撰写的《设计模式:可重用的面向对象软件的元素》的发布而获得了广泛的接受。 ,理查德·赫尔姆(Richard Helm),拉尔夫·约翰逊(Ralph Johnson)和约翰·弗利斯赛德(John Vlissides),统称为四人帮 (GoF)。 由于对23种经典软件设计模式进行了描述,因此该书大获成功。 设计模式对于帮助您将复杂的系统分解为通常适合于GoF描述的一种设计模式的组件非常有用。 因为我知道作为开发人员,我们喜欢学习,有时需要快速参考才能更好地完成工作,所以我要花时间写一系列文章,这是第一篇,以展示如何使用每种GoF设计模式在Swift中。 通常将设计模式分为几类相关的类别:创建模式,结构模式和行为模式。 在本文的其余部分,我们将重点介绍“ 创造”模式,并介绍我们的第一个模式:“ 工厂”模式。 创作模式:工厂模式 创建模式都是关于消除创建对象所涉及的复杂性的方法。 工厂模式是一种封装创建对象的实现细节的方法,该对象遵循通用的基类或接口。 工厂模式允许接收创建对象的客户端通过公共接口使用对象返回,而无需关心实际创建的具体对象的类型。 工厂模式将创建对象的实现细节与允许用户通用使用该对象的公共接口分开。 让我们考虑一个使这个想法更具体的例子。 想象一下,您经营一家猎头公司,其所有线索均来自各个工作委员会。 对于每个工作委员会,您都收集联系人详细信息并针对潜在的“目标”进行简历。 我的意思是求职者。 获得联系信息后,您可以对其进行分类,并向每个联系人发送样板电子邮件,告知潜在客户与他们的潜在匹配。 您想自动化该过程,因为您每周都要连接数百个潜在客户。 从本质上讲,您只是“以美元计价”,因此您可以处理的潜在客户越多,将潜在客户放置到头寸中的机会就越大,获得报酬的可能性就越大。 我们可以并且将使用工厂模式来解决此问题,以处理电子邮件模板的创建。 我将使用Swift Playground展示一种可以使用工厂模式实现目标的方式。 您可以在这里找到我用于此帖子的操场文件。 为简化起见,我们假设每个联系人将具有个人详细信息以及他们所寻找的角色类型。 首先,我们将创建用于将定制的电子邮件发送给潜在客户的接口(或更确切地说是协议),其中包含有关他们正在寻找的工作类型的信息。 而已! 我们的工厂示例已完成。 现在,我们可以根据他们寻求的工作类型向他们的联系人发送自定义的电子邮件。 只要我们的需求发生变化,我们就可以扩展我们的示例,并且只要我们的界面不变,就不必更改客户端使用的代码。 这意味着我们可以添加新的作业和求职者对象,以将自定义的电子邮件发送给新的联系人类型,而无需更改使用JobContactProtocol的客户端。 我们还可以更改用于创建模板的逻辑,因为这仅包含实现更改。 包起来 工厂模式使我们可以通过允许客户仅依靠公共接口与对象进行交互来隐藏创建对象的实现细节。 这使我们可以消除创建具有类似行为需求的对象所涉及的不必要的复杂性。 工厂模式还促进了分离和抽象,这两者都导致了易于维护的可重用代码。 您可以在此处找到本文的游乐场文件。 简要地说,我还写了一篇文章,说明为什么创建本地应用程序可能是大多数移动开发工作中最好的方法。 阅读并参与讨论! 您的混合应用程序将杀死您 如果您的公司仅开发混合应用程序,那么最终您将蒙受损失。 这只是时间问题。 混合手机… medium.com 如前所述,我将完成一系列有关设计模式的文章。 您可以在下面的文章链接中阅读有关装饰器模式的下一篇文章。 Swift中的设计模式—结构模式—装饰器模式 […]

Xamarin UIPickerView iOS

这是我的第一篇文章,并且源于不得不处理使用本机iOS的UI元素来跨平台Xamarin.iOS的烦恼。 通常会发现,当尝试实施iOS中的解决方案(Swift和Objective-C)时,在线提供的示例通常无法为您提供逐步的解决方案。 因此,在本文中,我将尽力而为,并帮助您使用UIPickerView。 根据我最喜欢的网站; 使用Chris的代码,UIPickerView是一个UI元素,可用于从多个选择中进行选择(类似于下拉菜单对网页所做的操作)。 以此类推。 我正在使用Xamarin Studio 6.0.1构建。 新解决方案> iOS:Single View App>单击下一步> AppName>单击下一步,并将所有其他内容保留为默认值。 打开您的Main.storyboard。 从对象工具箱中添加标签和PickerView。 在属性窗格下提供UI元素名称。 转到负责故事板中视图的UIViewController。 导入这些库 使用系统; 使用System.Collections.Generic; 使用UIKit; 2.实例化Picker的数据模型类。 PickerDataModel pickerDataModel; 3.在您的ViewDidLoad方法中,插入以下代码。 公共重写void ViewDidLoad() { base.ViewDidLoad(); //加载视图后,通常从笔尖执行任何其他设置。 //创建我们的简单选择器模型 pickerDataModel =新的PickerDataModel(); pickerDataModel.Items.Add(“蓝色”); pickerDataModel.Items.Add(“红色”); pickerDataModel.Items.Add(“紫色”); pickerDataModel.Items.Add(“白色”); //将其设置在我们的选择器类上 colorPicker.Model = pickerDataModel; //连接值更改方法 pickerDataModel.ValueChanged + =(s,e)=> { colorValueLabel.Text = pickerDataModel.SelectedItem; }; //在标签上设置我们的初始选择 colorValueLabel.Text = pickerDataModel.SelectedItem; […]

跋涉马拉松追踪器:原始版本

我设法学习了足够的python来编写脚本,该脚本可以从我们一直使用的网站上抓取所有剧集和电影信息,并将其转换为可以在iOS应用中使用的格式。 通过airdate进行排序非常容易,因为它已经按照正确的顺序进行了排序,所以我又一次保存了stardate进行排序的时间,那时sort函数看起来似乎不太吓人。 最初,该应用仅支持iPhone,并且仅使用最基本的UI元素。 该复选框取自Apple制造的示例项目。 它足以满足我们的需求。 我将永远不会忘记我第一次在设备上构建这种纯粹的兴高采烈的感觉。 在使用该应用程序时,我设法获得了无偿的实习机会,并且在办公室工作,支付Apple Developer许可证费用以及手持手机运行自己的应用程序之间,我终于感到自己像一个真正的iOS开发人员! 下一步是使UI更具“星际迷航”的感觉。 我知道我想要一个看起来像LCARS的东西,所以我们试图找到尽可能多的关于Michael Okuda设计的信息。 我们使用了演出和粉丝娱乐中的屏幕截图来构建设计灵感文档。 然后,我们尝试提取元素以构建自己的UI。 但是,我们发现尝试紧密匹配设计并没有带来最用户友好的界面。 对于更大的触摸区域以及在屏幕上获取尽可能多的信息的需求,驱使我们经历了多次迭代,直到我们确定自己喜欢的东西为止。

如何使用Swift 4(滑动选项卡/段)在iOS中实现类似于Android的选项卡布局

大家好,我所有的IOS开发人员。 在这里,我提供了一个很棒的教程,介绍如何创建滑动选项卡或细分,例如IOS中的Android选项卡布局。 为了实现这种功能,有很多种方法,我已经通过两种方法实现了这些功能,即使用UIPageViewController和CollectionView显示内容的页面/视图。 为了显示选项卡,我使用了CollectionView。 让我们详细介绍一下… 标签视图: 首先,在CollectionView的帮助下,在普通的UIView()对象上创建选项卡视图。 在这里,我们的类是“ MenuTabsView”,它是UIView的子类,用于确认集合视图委托和flowlayout委托。 接下来,添加一个帮助程序变量或标志属性,用于选项卡分发。 如果是这样,则所有选项卡都将以相等的大小(相对于屏幕)填充。 如果为false,则根据标签的标题大小放置标签。 接下来,集合视图需要数据源来显示标题或标题。 因此,我们为此提供一个数组属性。 接下来,我们需要一个协议来在此选项卡视图和包含该选项卡视图的“容器”视图之间进行通讯,以用于滑动/过渡视图。 在协议定义之后,还为集合视图单元标识符定义一个变量。 稍后为该类定义初始化程序。 如果您在上面的代码中看到,在两个初始化程序中都有一个函数被调用。 我们使用了customIntislizer()方法,注册了集合视图单元格,在视图上添加了该集合视图,并给出了约束。 我们可以通过多种方式对视图或子视图施加约束,其中之一是视觉格式语言。 因此,为了传递这些约束,我定义了一个辅助方法,该方法减轻了在项目中传递视觉格式约束的痛苦。 就是这样… customIntializer函数:定义为私有,因为它不需要类的外部。 接下来,记住我们为tabs集合视图定义了数据源的属性。 在此帮助下,我们显示了标签。 设置dataArray后,我们将重新加载collection-view。 集合视图委托方法: 以下是集合视图委托,数据源和集合视图委托流程布局方法。 请看以下图片,这些图片仅供参考。 现在,记住我们注册了一个名为BasicCell的单元, 上面的收藏视图。 让我们现在来看那个课。 单元格具有一个Label(用于显示标题)和一个指示器视图(如一个下划线)以显示所选标签。 我们可以在背景和标签属性的帮助下根据需要配置更多内容。 这两个组件均已定义,并已受到约束。 在选择单元格时,我们通过覆盖单元格上的“ isSelected”属性来配置选定的单元格。 标签视图已完成。 我们在视图控制器中使用此选项卡视图。 因此,上一个类,然后在视图控制器场景的顶部拍摄一个高度约为50的子视图。 x和y坐标为0,0。 width等于视图控制器的宽度。 接下来,定义以下属性并配置menuBarView。 稍后将代表分配给self,以获取所需的代表,然后配置屏幕的初始显示。 我们在这里使用UIPageViewController作为内容视图容器,它将作为子视图控制器添加到我们的viewcontroller视图中。 接下来,从对象库中获取一个UIPageViewController和一个ViewController,并为其分配以下类。 接下来,定义以下帮助程序方法,我们也在viewDidLoad中使用了这些方法。 接下来,在项目中的任何位置,定义以下协议,我们在menuBarView类中定义了以下协议。 如果您喜欢在menuBarView类上方定义此对象。 接下来,定义所有委托方法。 请经历以下委托方法,这些方法是不言自明的。 就这样。 现在运行您的项目,您可以看到上面的输出,像Android这样的功能,如选项卡布局。 要获取源代码,请访问此处。 感谢您阅读我的教程。 […]

Eid ul Fitar 2017,iPhone和iPad的Greetings应用程序

Eid Mubarak —向所有人问好,Eid ul Fitar是iPhone和iPad上最好的100个Eid穆巴拉克应用程序之一。 与您的家人和朋友一起庆祝开斋节快乐,并通过优美的短信向他们致以良好的祝愿和祈祷,激发他们的灵感,并在他们的祈祷中得到纪念。 一个真棒的便捷应用程序,适合任何在这个快乐的日子和伊斯兰节日开斋节中希望祝福亲戚和朋友的人。 您知道EID是什么意思吗? 开斋节是3个有意义的单词的组合 E —敞开心heart拥抱 我-以令人印象深刻的态度启发 D —向所有人分配快乐。 开斋节穆巴拉克 以精美的样式呈现数百种文字,引语,祈祷和美好的祝福,以节省您的宝贵时间,而无需思考和打字,只需在iPhone或iPad上下载此应用并开始向所有人致意或与任何人分享这些Eid问候您可以通过短信,电子邮件,whatsapp,Facebook,Messenger甚至可以将其保存在Notes中。 在时间轴上发布问候语。 将开斋节设置为您的whatsapp状态。 这个Eid上必须有一个应用程序,所以您在等待什么,现在就开始希望您的家人和朋友! 祝您来自SA APPS的Eid Mubarak 如果您喜欢我们与他人的应用程序共享以及花时间在iTunes上对其评分,我们将不胜感激所有反馈 屏幕截图: 从iTunes App store下载: https://itunes.apple.com/us/app/eid-mubarak-greet-everyone-eid-ul-fitar/id1251682845?mt=8

键盘显示时如何引发U​​ITextField

初学者在构建自己的应用程序时,最常遇到的问题之一就是在键盘弹出时提高UIView或其众多子类之一。 有数十个Stack Overflow帖子,每个帖子都有数百条评论,所有这些都试图回答这个简单的问题。 即使对于经验丰富的老手来说,这样做也有点麻木,尤其是对于初学者,可能很难筛选所有可能的答案并自己选择最佳的解决方案。 此外,即使有人选择了某个解决方案,他们也常常无法确切了解引擎盖下发生了什么,或者该解决方案的好坏。 这会阻止人们快速学习,并可能导致他们养成不良习惯。 在这里,我将尝试给出解决方案,其背后的思考过程,并深入解释为什么我要这样做。 让我们开始吧。 在开发您在iOS中不确定的东西时,您的第一反应应该是参考Apple文档。 通常,您会发现大量有用的信息(只要您仔细阅读!)。 我在浏览“ 与键盘相关的通知”部分下的UITextField文档时发现了一些花哨的地方: “因为系统响应响应者的更改来管理键盘的显示和隐藏,所以它会发布以下通知来跟踪与键盘相关的更改” 这些通知是: UIKeyboardWillShow UIKeyboardDidShow UIKeyboardWillHide UIKeyboardDidHide UIKeyboardWillChangeFrame UIKeyboardDidChangeFrame 好的,太好了-因此,这些通知会告诉您键盘何时开始执行操作。 但是我们如何收到这些通知? 在iOS中,我们使用NSNotificationCenter(如果您使用的是Swift,则使用NotificationCenter)在整个应用程序中发送或接收通知。 如果您不太了解iOS中的通知,请稍后再回来查看我的通知博客文章。 在开始研究方面,我们几乎有所需的东西! 我们希望收听这些通知的发布,并在收到通知时可以调整我们的UI,以使一切看起来都很好。 让我们编码。 创建一个新项目(命名为任何名称) 打开情节提要文件,并使用自动布局将UITextField固定到视图控制器的底部。 添加前导约束,以便我们定义x值 添加尾随约束,以便我们定义宽度 添加底部约束,以便我们定义ay值 如果我们现在运行该应用程序并按文本字段,则键盘将显示并覆盖文本字段。 现在让我们修复它。 3.在ViewController.swift中,将以下代码添加到viewDidLoad函数中: NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillShow),名称:NSNotification.Name.UIKeyboardWillShow,对象:nil)NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillHide),名称: NSNotification.Name.UIKeyboardWillHide,对象:无) 在这里,我们正在默认的通知中心注册我们的视图控制器,以便可以在显示或隐藏键盘时进行更新。 您会注意到,对于选择器,我使用了文件中尚不存在的函数-现在让我们将它们写出来。 4.将以下函数头添加到ViewController.swift: @objc func keyboardWillShow(通知:NSNotification){} @objc func keyboardWillHide(通知:NSNotification){} 5.现在,我们需要获取键盘更新后的大小信息。 可通过传入的NSNotification参数userInfo对象获得此信息。 userInfo对象是可选的,因此我们需要先对其进行拆包以验证其存在: 守护让userInfo = notification.userInfo else {return} 6.为了获得键盘的大小,我们需要使用键UIKeyboardFrameEndUserInfoKey访问userInfo字典。 […]