影视网站建设源码哪个好建立中文网站的英文
2026/4/16 14:44:38 网站建设 项目流程
影视网站建设源码哪个好,建立中文网站的英文,潍坊专业建站,单一页面网站怎么做第1章 手势与触摸触摸是iOS交互的核心#xff0c;它提供了一种非常关键的手段#xff0c;使用户可以向应用程序表达自己的意图。触摸并不局限于“按下按钮”或“点击键盘”这两种动作。你可以设计并构建出一种应用程序#xff0c;令其能够以有意义的方式来直接处理用户的手势…第1章 手势与触摸触摸是iOS交互的核心它提供了一种非常关键的手段使用户可以向应用程序表达自己的意图。触摸并不局限于“按下按钮”或“点击键盘”这两种动作。你可以设计并构建出一种应用程序令其能够以有意义的方式来直接处理用户的手势。本章将要创建一套“直接操纵界面”direct manipulation interface这套界面远比系统内置的控制手段强大。你会在本章中学到如何创建一种可供用户在屏幕上拖曳的视图。此外还会学到怎样用手势识别器类来分辨并解析手势手势是对触摸的一种高级抽象方式而手势识别器类则可以自动检测常见的点击tap、滑动或扫屏swipe及拖曳drag等手势。学完本章之后你就可以在自己的应用程序里面以各种不同的方式来实现手势控制了。1.1 触摸Cocoa Touch以最简单的方式实现了直接操纵也就是向用户正在操作的视图发送触摸事件。iOS开发者会告诉这个视图应该如何响应用户。在开始讲手势和手势识别器之前首先应该牢固地掌握底层触摸技术。因为所有基于触摸的交互操作都需要使用由底层触摸技术所提供的关键组件。每次触摸都包含下列信息触摸操作发生在何处当前触摸的位置和上一次触摸的位置、触摸操作位于哪个阶段直接操纵界面中的“按下”、“移动手指”及“抬起手指”分别相当于桌面应用程序里的“按下鼠标按钮”、“移动鼠标”和“松开鼠标按钮”、点击的次数是单击还是双击以及触摸操作发生的时间以时间戳表示。iOS使用响应者链来决定应该由哪个对象处理触摸。顾名思义响应者就是响应事件的对象而响应者链则是一条由可以处理这种事件的对象所组成的链。用户触摸屏幕时应用程序会找寻相关对象来处理此操作。触摸事件将在视图之间传递直到某个对象开始负责响应该事件为止。从根本上说每个触摸操作及其信息都保存在UITouch对象里面而这样一组UITouch则放在UIEvent对象里面传递。每个UIEvent对象都表示一次触摸事件其中包含一个或多个UITouch。具体数量是多少取决于两个因素一是开发者设定应用程序应该以哪种方式来响应触摸也就是说开发者是否开启了多点触摸二是用户如何触摸屏幕也就是实际触摸了几个点。应用程序会在视图类或视图控制器类里接收到触摸事件而这两种类都继承了UIResponder类于是也就自动实现了触摸处理程序touch handler。开发者可以自己决定应该在哪个类里面处理并响应触摸事件。许多iOS开发新手都想试着在非响应者类里实现底层的手势控制但他们可能会遇到麻烦。在视图中处理触摸事件似乎有违常理。你可能觉得应该把界面的样貌也就是视图与它响应触摸的方式也就是控制器分开。此外直接用视图来处理触摸似乎也有违“模型-视图-控制器”Model-View-Controller设计规范不过有时候这么做还是必要的而且可以提升封装程度。我们有时要面对多个能够响应触摸事件的子视图比方说在棋类游戏中棋盘上的棋子就是如此。如果直接把交互行为构建在视图类里面那么开发者就能够在隐藏实现细节的前提下向应用程序的核心代码发送含义丰富的反馈信息。例如开发者可以在玩家结束操作之后告知模型“兵”pawn移动到了“后”Queen这一侧“象”Bishop列的第5格[1]假如不采取这种响应方式那么开发者就要传输一系列没有意义的坐标变化信息了。响应触摸事件时把棋子的移动细节隐藏起来就可以用棋类游戏所专有的术语来编写模型部分的代码而不用再考虑棋子在视图中的位置变化。选择在UIView类中响应触摸事件的另一个原因是便于绘制。如果想令应用程序在响应用户的触摸时处理绘制操作drawing operation就需要把触摸处理程序放在视图中实现。因为视图控制器与视图不同它并没有实现drawRect方法而在执行自定义的绘制操作时drawRect却是个至关重要的方法。在UIViewController类里响应触摸同样有其优点。这样做的好处是我们不用把主要的事件处理逻辑放在另一个类里实现而是可以直接把管理触摸的代码放在视图控制器中以便在需要用到“按住不放”tap-and-hold及“滑动”等标准手势的时候解析它们。这种做法可以令代码保持集中而且可以使控制器能够直接和应用程序的模型交互。在后续的数节及解决方案里面你将学到触摸操作的工作原理、如何在应用程序里响应触摸以及如何把用户所看到的内容同其与屏幕的交互方式联系起来。[1] 国际象棋步法的描述方式请参见https://en.wikipedia.org/wiki/Descriptive_chess_notation。——译者注1.1.1 触摸操作所处的阶段触摸有其生命周期。每个触摸操作都会处于下列五个阶段之一而这五个阶段合起来就代表了界面中的触摸操作所历经的过程。这些阶段分别是·UITouchPhaseBegan——用户一旦触摸屏幕即进入此阶段。·UITouchPhaseMoved——用户的手指在屏幕上移动。·UITouchPhaseStationary——自上一个事件发生之后用户仍然在触摸着屏幕表面但却没有移动。·UITouchPhaseEnded——当用户把触摸屏幕的手指从屏幕上拿开之后就进入了这个阶段。·UITouchPhaseCancelled——如果iOS系统不再追踪某个触摸操作那么就会进入该阶段。这通常是因为系统中断而导致的比方说应用程序不再处于活动状态或相关的视图已经从视窗里移走。总体来说用这五个阶段就可以描述触摸事件了。它们描述了在处理界面中的触摸操作或无法处理某个触摸操作时所能遇到的全部状况并且为相关界面提供了一套基本的控制手段。至于如何解析并响应这些情况就是每一位开发者的事情。你可以实现一系列的响应者方法[1]来响应触摸事件。[1] 作者把UIResponder类里面与处理触摸事件有关的几个方法叫作“响应者方法”或“UIResponder方法”下同。——译者注1.1.2 UIResponder类中的触摸事件响应方法包括UIView及UIViewController在内的所有UIResponder子类都可以响应触摸。每个类都可以决定自己要如何响应。决定好响应方式之后就可以在类中实现自定义的行为了而当用户拿一个或多个手指触摸视图View或视窗Windows时该类能够以定义好的行为来响应触摸。UIResponder类中预先定义了一些回调方法分别用来处理“用户开始触摸屏幕”、“在屏幕上移动手指”以及“从屏幕上拿开手指”等情况。相关的方法一共有四个它们对应于上一节所讲的阶段·touchesBeganwithEvent——当触摸事件处于“起步阶段”starting phase也就是用户刚开始触碰屏幕时系统会调用这个方法。·touchesMovedwithEvent——当用户触摸屏幕并持续在屏幕上移动手指时系统会调用这个方法。·touchesEndedwithEvent——当用户把触摸屏幕的一根手指或所有手指都从屏幕上拿开时触摸过程就结束了而系统此时会调用这个方法。如果在用户移动手指的过程中程序做了一些处理那么此时应该执行相关的清理工作。·touchesCancelledWithEvent——如果目前正在发生的触摸事件遭到系统阻断致使Cocoa Touch必须对此做出响应那么系统就会调用这个方法。上面列出的每一个方法都是UIResponder方法它们通常会由UIView或UIViewController子类来实现。所有的视图都会继承这几个方法而继承下来的这些方法并没有实际的功效。如果想使自己的应用程序支持触摸就应该覆写这些方法并在其中编写代码以实现应用程序所需的响应功能。请注意UITouchPhaseStationary并不会触发回调。你自己的类可以把四个方法全都实现了也可以只实现其中的某些方法。在制作真实的应用程序时开发者一般都会实现touchesCancelledWithEvent以便处理用户将手指拖动到屏幕边界外面或者有电话打进来的情况在这两种情况下当前的触摸序列touch sequence会取消。一般来说当触摸事件取消时我们可以在回调方法里面调用touchesEndedwithEvent方法。这样做可以使代码“走”完整个触摸序列即便用户还没有把手指从屏幕上拿起程序也依然可以完成触摸序列。在处理触摸时苹果公司建议开发者最好把四个方法全都覆写。提示 视图有个模式叫作exclusive touch此模式会阻止系统把触摸投递给同一个视窗里的其他视图。启用此模式之后也就是把exclusiveTouch属性设为YES之后这个视窗里的其他视图就收不到触摸事件了而是由主视图来专门负责处理全部的触摸事件。1.1.3 对视图的触摸当屏幕上有很多视图的时候iOS会自动判断出用户触摸的是哪个视图然后会把触摸事件传给适当的视图去处理。这样一来开发者就可以编写具体的直接操纵界面使用户可以触摸、拖曳并与屏幕上的物件交互。某个视图上面发生了触摸操作并不意味着非得由这个视图来响应触摸。每个视图都可以经由触摸判定机制hit test来选择是处理这次触摸还是把它留给下面的视图去处理。在后面的解决方案中你会看到可以巧妙地运用一些响应策略来决定视图应该何时响应触摸尤其当我们使用了半透明的特殊图形时更可以灵活运用响应策略。首个通过点击测试的视图可以决定自己是否处理这个触摸操作。如果此视图决定把这个触摸操作传递出去那么它就会到达该视图的上级视图superview并且可以沿着响应者链逐级向上传递直至有视图处理它或是到达拥有这些视图的视窗为止。若视窗也不处理此操作那么触摸事件就会移动到UIApplication实例该实例要么处理它要么丢弃它。1.1.4 多点触摸iOS支持单点触摸Single-Touch和多点触摸Multi-Touch界面。单点触摸GUI每次只能处理一个触摸操作。在这种情况下开发者无须判断当前正在追踪的是哪一个触摸事件。接收到的触摸事件也就是待处理的触摸事件。开发者只需要查看其数据、响应此事件并等待下一个事件即可。在处理多点触摸也就是同时响应屏幕上的多个触摸时开发者收到的是一组触摸。你需要决定其顺序并响应这一组触摸。不过你也可以自己分别追踪每个触摸事件观察它们各自是如何随着时间的推移而改变的这样的话你就可以实现出一套更为丰富的用户交互功能了。本章稍后的解决方案将会演示单点触摸和多点触摸。1.1.5 手势识别器手势识别器是苹果公司提供的一种强大的识别方式用来检测界面中的特定手势。手势识别器简化了触摸程序的设计。这些识别器本身就封装了与触摸有关的方法所以开发者无须自己来实现它们提供了一套目标-动作target-action反馈机制这套机制能把实现细节隐藏起来。这些识别器同时也形成了一套标准可以把某些移动形式划分到不同的类别里面例如拖曳drag、滑动swipe等。使用了手势识别器类之后当用户做出点击tap、双指聚拢pinch、旋转rotate、滑动swipe、拖动pan或长按long press手势时系统就会自动触发相关的回调方法。有了这种检测能力开发基于触摸的界面就变得更加简单了。为了提高程序的可靠程度你可以自己编写相关的代码但是大部分开发者都觉得系统自带的识别器已经足够健壮并可以满足很多应用程序的需求。本章将会给出几个基于识别器的解决方案。由于各种识别器的基本工作原理都一样所以你可以轻易地扩展这些解决方案以满足自己的手势识别需求。下面列出新版iOS SDK内置的几种手势·点击——用户拿一根或多根手指触碰屏幕这就是点击。用户可以拿一根手指做出点击手势也可以用多根手指做出该手势。开发者通过指定gestureRecognizers属性来设定自己想要检测的点击次数。你可以创建一种点击识别器令其检测用一根手指所做的点击也可以创建更为复杂的识别器比方说可以创建一种识别器用来判断用户是否以两根手指做了三次点击two-fingered triple-tap。·滑动——在水平或垂直方向也就是上、下、左、右上所做出的短距离单点触摸或多点触摸手势就叫作滑动或扫屏。这种手势不能太偏离主方向primary direction。开发者可以在识别器上面设定想要侦测的方向而识别器则会把侦测到的方向作为属性返回给开发者。·双指聚拢——用户拿两根手指向内聚拢这就是双指聚拢或缩小、挤压手势两根手指向外移动各自远离这就是双指张开或扩大、拉伸手势。识别器会根据挤压或拉伸的程度把缩放因子返回给开发者。·旋转——两根手指同时依顺时针或逆时针移动这就是旋转手势识别器会把旋转角度和旋转速度返回给开发者。·拖动——拿手指在屏幕上做出拖曳动作这就是拖动或拖移手势。识别器会侦测出拖曳操作所产生的坐标变化。·长按——用户触摸屏幕并在某段时间内按着手指不放这就是长按手势。开发者可以指定用户必须按下多少根手指才能令识别器侦测到该手势。1.2 解决方案添加简单的直接操纵界面在开始讲比较流行也比较常用的手势识别器之前我们先花点时间看看如何用传统的方式响应用户触摸。在明白了UIResponder类里面简单的触摸事件处理机制如何运作之后你就能深入理解触摸界面了。制作直接操纵界面时开发者的设计重点是UIView而不是UIViewController。研发直接操纵界面时的核心问题就是视图或者说得更准确一些是UIResponder。我们自己编写从UIResponder类继承下来的相关方法以创建基于触摸的界面。解决方案1-1中的代码直接实现了触摸功能。这段范例程序创建了UIImageView类的子类DragView并为该类添加了响应触摸的能力。由于这是个ImageView所以要记得开启用户交互功能也就是说应该把setUserInteractionEnabled设为YES。此属性既会影响视图本身也会影响它的所有子视图。大部分的视图在默认情况下都已经启用了用户交互功能但UIImageView是个例外许多新手都在这个问题上卡住了。显然苹果公司觉得大部分人都不会在UIImageView上面使用触摸功能。这个解决方案会更新DragView的中心坐标使之与屏幕上的触摸移动情况相符。用户首次触碰屏幕上的某个DragView时该DragView对象会把触摸点与DragView的原点之间的偏移量保存到startLocation对象里面。用户拖曳这个DragView的时候它会随着用户的手指一起移动也就是说它目前的原点与用户目前的触摸点之间的偏移量会与startLocation里面所保存的那个量相同这样的话移动效果就会显得比较平滑。我们通过更新DragView对象的中心点center来移动DragView。解决方案1-1中的代码会算出x轴和y轴方向上的偏移量并在用户每次移动手指的时候据此调整DragView的中心点。解决方案1-1 创建可以拖曳的视图用户所触摸的DragView会显示在屏幕最前方这是因为我们在touchesBeganwithEvent里调用了一个方法这个方法会告诉DragView的上级视图应该把当前DragView带到屏幕最前方。这样的话当前处于活动状态的元件就总是会出现在界面的最上层。这个解决方案并没有实现与触摸结束touches-ended或触摸取消touches-cancelled有关的方法[1]它只关注用户在屏幕上移动手指的操作。当用户不再和屏幕交互时DragView类不需要做后续的处理。获取解决方案代码访问https://github.com/erica/iOS-7-Cookbook网页并打开“C01Gestures”文件夹即可找到与本章中的解决方案相对应的完整范例项目。[1] 具体指的就是touchesEnded:withEvent:方法与touchesCancelled:withEvent:方法下同。——译者注

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询