Tag: Paul Hegarty

CS193P:使用Swift讲座4笔记开发iOS应用

今天,我们将讨论自定义视图,特别是工程图视图。 什么是视图? 基本上,我们使用这些分层的矩形视图来构建UI。 视图可以有许多子视图 ,但只能有一个子 视图 。 如果您从计算器应用程序中回想起,我们的堆栈视图包含按钮的子视图,甚至其他堆栈视图。 我们可以使用Xcode中的界面生成器来构建视图,也可以通过编程方式来构建视图。 UIViewController中有一个重要的属性,称为view ,它是窗口中的顶级视图。 请注意,当该视图旋转时,其边界将改变。 然后,我们就有机会更改此视图中的所有子视图。 此功能使我们可以根据设备的方向或大小指定视图的关系。 通常,尽管我们不需要此视图,因为我们倾向于将视图添加为可以直接使用的出口(@IBOutlet)。 那么我们如何初始化UIView? 好吧,如果您还记得在Swift中,类的初始化有很多规则,那么我们会尽量避免使用它们。 但是,如果我们不能避免它们,则有两种初始化UIView的方法,我们应该注意。 初始化(框架:CGRect) 如果我们以编程方式创建视图,则使用上述初始化。 如果我们选择使用接口构建器在Xcode中创建视图,则可以使用以下初始化: 初始化(编码器:NSCoder) 这个编码器是关于什么的。 好吧,我们使用界面生成器创建的所有视图都被编码为XML文件。 当我们运行程序时,该XML文件将被加载,并且基本上包含有关如何创建这些对象的说明。 如果我们需要一个视图初始化器,则需要实现这两种方法,以便无论是在代码中还是在Xcode中创建视图都可以初始化。 设置我们的视图的另一种方法是awakeFromNib ,该视图只有在界面构建器中创建后才能起作用。 每当我们在视图中处理与绘图有关的任何事情时,我们都会使用CGFloat类型。 CG代表核心图形。 CGRects还有很多其他便利方法,我们应该很好地熟悉它们。 让我们看一下坐标空间。 我们将看到它不是笛卡尔坐标系。 在笛卡尔系统中,上升意味着增加y坐标的值。 在这里是不同的。 请注意,我们处理的是点 ,而不是像素 。 像素就像是可以在屏幕上显示的最小的光线。 一些设备的每个点有很多像素,这意味着像素被密集地包装。 这很棒,因为这意味着当我们查看曲线(如字体)时,它们不会出现锯齿状的边缘。 想想Retina显示屏上当前的Macbook和iPhone。 由于每个点压缩了多少像素,我们不能使用像素作为绘图单位,因为在密集压缩的像素设备上,我们的绘图看起来非常小,而在轻度压缩的像素上,绘图或图像会显得更大。 因此,我们得出了结论。 所有UIView中最重要的属性是 bounds 。 其余两个属性 center 和 frame 与边界混淆了,但是它们与绘制位置(边界)无关。 框架和中心与我们所处的位置有关。 底线是永远不要使用框架和中心绘制。 它们仅应用于将您置于您的超级视图中。 […]

CS193P:使用Swift Lecture 2 Notes开发iOS应用程序

什么是MVC? MVC基本上不适合我们将应用程序分为3个不同的阵营,即Model,View和Controller 。 该模型与您的应用程序做什么有关。 它与应用程序的显示或在屏幕上绘制的方式无关。 对于计算器应用程序, 模型可能是进行计算的部分。 控制器与模型的显示方式或在屏幕上的显示方式有关(UI逻辑)。 视图是您的控制器的奴才。 这些是Controller用来在屏幕上放置诸如按钮,标签,表格等之类的东西以显示Model中的内容以及从用户那里获取输入以更新Model的东西。 知道如何将代码分为这三个阵营是一回事,但难题的关键在于它们之间的通信。 也就是说,什么是允许的,什么是不允许的。 Controller必须完全控制Model ,并且可以随时与它对话。 它需要完全访问权限,因为它的工作实际上是向用户展示此模型中的内容,并根据用户输入来更新模型。 Controller需要能够使用其奴才,但是它想显示Model 。 在大多数情况下, 控制器和视图之间的连接是通过插座进行的 。 在Xcode中,它显示为@IBOutlet 。 例如,我们在计算器中用于显示的标签是控制器用来显示Model中执行的数字和计算结果的插座。 该模型是独立于UI的,而View是完全UI的。 他们绝对不应该互相交谈。 视图可以与控制器对话吗? 是的,没有。 View的问题在于其中的所有奴才都有通用对象,例如UIButton和UILabel 。 它们是由Apple几年前创建的,对您正在构建的应用程序(在本例中为计算器)一无所知。 但是,有时需要将UI中的更改传达给Controller 。 然后, View与Controller的通信方式必须“盲目”和“结构化”。 沟通是盲目的 ,因为视图中的对象不知道它们正在与哪些类进行交谈。 例如,按钮对CalculatorViewController一无所知。 之所以构成这种通信,是因为由于不了解对象的两端,因此它们必须以定义良好的预定义方式进行通信。 视图可以与Controller进行通信的结构化方式有哪些? Target-Action:这非常简单,因为Controller可以通过定义方法将目标挂起。 @IBAction。 然后,当View要与Controller对话时, View会调用此方法。 制作touchDigit函数时,我们在计算器应用程序中使用了“ 目标:操作 ”通信方式,因为我们希望按下按钮以调用计算器中的方法并告诉我们按下了哪个按钮。 有时, 视图需要传达比“被感动”更复杂的东西。 例如,作为通用View仆从的ScrollView可能需要告诉Controller某人开始滚动,或指示某人放大了特定的缩放比例。 也就是说,它想通知控制器,因为控制器可能希望对此做出反应。 放大或缩小时, 模型可能会更改。 此外,也许ScrollView需要确保做某事是否可以。 可能需要问控制器一个问题:“我现在应该允许垂直滚动吗?”。 我们有很多消息涉及到诸如Mins […]