《iOS 6核心开发手册(第4版)》——2.10节子类化UIControl

2.10 子类化UIControl
iOS 6核心开发手册(第4版)
UIKit提供了许多预先构建的控件,可以直接在应用程序中使用它们。这些控件包括按钮、选项开关和滑块等。但是,为什么要在那里止步不前?不必把自己局限于Apple提供的项目。为什么不创建你自己的控件呢?

秘诀2-5演示了如何子类化UIControl,以从头开始构建新控件。这个示例创建一个简单的拾色器。在使用时,它允许用户通过触摸或者在控件内拖动来选择一种颜色。当用户左右移动时,颜色改将变其色相。上下移动则会调整颜色的饱和度。颜色的亮度和Alpha层次则固定为100%。

这个控件简单易用,因为除了检索触摸的x和y坐标之外,并不涉及太多的交互。它提供了一个基本的示例,用于演示在子类化UIControl时涉及的大多数开发问题。

那么,为什么要构建自定义的控件呢?首先,可以设置你自己的设计风格。放在界面中的元素可以并且应该匹配应用程序的美学标准。如果Apple预先构建的选项开关、滑块和其他GUI元素不能自然地适应你的界面,自定义的控件将满足你的应用程序的需求,而不会牺牲具有凝聚力的设计。

其次,可以创建Apple没有提供的控件。从通过单击一系列星星来选择评级,或者从一组弹出式彩色蜡笔中选择一种颜色,自定义的控件允许应用程序超越SDK中的系统提供的按钮和选项开关来与用户交互。通过子类化UIControl,很容易构建独特的、引人注目的交互式元素。

最后,自定义的控件允许添加一些不能直接或者通过子类化访问的特性。利用相对很少的工作,就可以从零开始构建自定义的按钮和步进器,允许完全按照自己的需要调整它们的交互词汇表。

总是要使自定义的项目看上去与系统提供的项目具有明显的区别。不要纠缠在HIG问题上。如果使用看上去很像的项目,在把应用程序提交给App Store时,可能希望给Apple添加一条注释。要清楚说明创建的是一个新类,而不是使用私有API或者以非App Store安全的方式访问它们的对象。即便如此,仍可能会拒绝你创建潜在的会使最终用户感到困惑的项目。

2.10.1 创建控件
构建UIControl的过程一般涉及4个截然不同的步骤。如秘诀2-5所示,首先子类化UIControl以创建一个新的自定义类。在该类中,布置初始化中的控件的视觉外观。接下来,构建一些方法来跟踪和解释触摸,最后生成事件和可视化的反馈。

几乎所有的控件都提供了某种类型的值。例如,选项开关具有isOn,滑块具有浮点value,文本框则提供text。利用自定义的控件提供的值类型是任意的,可以是整数、浮点数、字符串,或者甚至是一种颜色(比如在秘诀2-5中)。

在秘诀2-5中,控件布局基本上是一个彩色的矩形。更复杂的控件需要更复杂的布局,但是甚至像这里所示的简单布局也可以很好地工作,提供充满凝聚力的最终用户体验所需的所有触摸交互空间和反馈。

2.10.2 跟踪触摸
UIControl实例使用一个嵌入式方法集来处理触摸。这些方法允许控件在与控件对象的整个交互期间跟踪触摸。

beginTrackingWithTouch:withEvent:——当触摸进入控件的界限内时调用。
continueTrackingWithTouch:withEvent:——当触摸保持在控件的界限内时利用重复调用跟随触摸。
endTrackingWithTouch:withEvent:——为事件处理上一次触摸。
cancelTrackingWithEvent:——管理触摸取消。
通过在UIControl子类中实现任何或所有这些方法,来添加自定义的控件逻辑。秘诀2-5使用开始和继续方法定位用户触摸并跟踪它,直到触摸抬起或者离开控件为止。

2.10.3 调度事件
控件使用目标—动作对来通知由事件触发的改变。在构建一个新控件时,必须决定对象将生成什么类型的事件,并添加代码来触发那些事件。

通过调用sendActionsForControlEvents:给自定义的控件添加调度程序。该方法允许把事件(例如UIControlEventValueChanged)发送给控件的目标。控件通过给UIApplication部件发送消息来传送这些更新。如Apple所指出的,应用程序充当所有消息的集中式调度点。

无论类有多简单,都要创建尽可能完整的控件词汇表。你无法准确预期将来将如何使用类。超标准设计事件可以为将来的使用提供灵活性。秘诀2-5为一个非常简单的控件调度了广泛的事件。

在哪里调度事件在很大程度上依赖于最终构建的控件。例如,选项开关控件实际上只对触摸抬起事件感兴趣,这发生在它们的值改变时。与之相比,滑动控件主要与触摸移动事件有关,当控件跟踪手指移动时需要持续进行更新。相应地调整编码,并且要记住在触摸周期的各个部分展示适合的可视化改变。

时间: 2024-09-30 13:03:58

《iOS 6核心开发手册(第4版)》——2.10节子类化UIControl的相关文章

《iOS 6核心开发手册(第4版)》——2.12节构建触摸式转盘

2.12 构建触摸式转盘 iOS 6核心开发手册(第4版) 下一个秘诀是创建一个触摸式转盘,就像老款的iPod上使用的触摸式转盘一样.触摸式转盘提供了无限的可滚动输入.用户可以顺时针或者逆时针旋转他们的手指,并且对象的值将相应地增加或减小.每转一圈,转盘(即转动360°)对应于值改变1.0.顺时针的改变为正,逆时针的改变则为负.每次触摸的值会累加起来,也可以对它进行复位(只需把控件的value属性重新设置为0.0即可).这个属性不是UIControl实例的一个标准部分,即使许多控件都会使用该值.

《iOS 6核心开发手册(第4版)》——1.6节秘诀:测试触摸

1.6 秘诀:测试触摸 iOS 6核心开发手册(第4版) 屏幕上用于直接操作界面的大多数视图元素都不是矩形.这使触摸检测变得复杂,因为实际的视图矩形的某些部分可能不对应于实际的触摸点.图1-2显示了实际发生的问题.右边的截屏图显示了界面及其基于触摸的子视图,左边的截屏图则显示了每个子视图的实际视图界限.每个屏幕上的圆形周围的淡灰色区域都落在界限内,但是对这些区域的触摸应该不会"碰到"正在处理的视图. iOS会在整个视图框架内感知用户点按.这包括未绘图的区域(比如图1-2中的实际圆形外面

《iOS 6核心开发手册(第4版)》——1.14节秘诀:实时触摸反馈

1.14 秘诀:实时触摸反馈 iOS 6核心开发手册(第4版) 你曾经需要录制iOS应用程序的演示吗?这总会涉及折中.可以使用架空相机并与影子作斗争,另外用户的手可能会挡住屏幕,或者可以使用像Reflection(http://reflectionapp.com)这样的工具,但是只能看到直接出现在iOS设备屏幕上的内容.这些应用程序录制缺少关于用户触摸和视觉焦点的任何指示. 秘诀1-13提供了一组简单的类(称为TOUCHkit),它们提供了实时的触摸反馈层级,可供演示使用.利用它,可以同时查看正

《iOS 6核心开发手册(第4版)》——1.1节触摸

1.1 触摸 iOS 6核心开发手册(第4版) Cocoa Touch以可能最简单的方式实现直接操作.它把触摸事件发送给正在处理的视图.作为一名iOS开发人员,你将告诉视图如何做出响应.在深入研究姿势和姿势识别器之前,应该在这种底层触摸技术上打下坚实的基础.它提供了所有基于触摸的交互的必要组件. 每个触摸都会传达信息:触摸发生的位置(当前和以前的位置).使用的是触摸的哪个阶段(在桌面应用程序中实质上是鼠标按下.鼠标移动和鼠标抬起,在直接操作世界中对应于手指或触摸按下.移动和抬起).点按计数(例如

《iOS 6核心开发手册(第4版)》——2.16节秘诀:创建可自定义的分页滚动条

2.16 秘诀:创建可自定义的分页滚动条 iOS 6核心开发手册(第4版) 程序清单2-1引入了一个基本的分页滚动条,但是没有给方程式添加任何动态交互.那个示例开始和结束于3个页面.在现实生活中,当可以自由地添加和删除页面时,页面控件要有用得多.秘诀2-10正好用于此任务.它添加了一些按钮,用于为UIScrollView构建和删除视图. 这种方法使用4个(而不是两个)单独的控件来产生图2-10所示的添加和删除交互.4个按钮包括一个使用标准的Contacts Add按钮样式构建的添加按钮,一个模仿

《iOS 6核心开发手册(第4版)》——2.13节秘诀:创建拉式控件

2.13 秘诀:创建拉式控件 iOS 6核心开发手册(第4版) 想象一下屏幕顶部有一根绳子.用力拉它,它会使铃声响起来,或者通过控件的目标-动作机制触发某类事件.例如,它可能展示一个附件视图.开始一个下载,或者开始视频播放.这个秘诀构建一个类似于丝带的控件.在交互时,该控件将会更新客户,它必须开始于"丝带"的顶部,向下拉得足够远以触发一个请求.然后,丝带将再次把自身缠绕起来,为下一次交互做准备. 图2-7显示了这个秘诀构建的控件,在这个示例中它被连接到附件视图的底部.用力拉它将使视图处

《iOS 6核心开发手册(第4版)》——2.15节添加页面指示控件

2.15 添加页面指示控件 iOS 6核心开发手册(第4版) UIPageControl类提供了一行圆点,指示当前显示的是多页视图的哪个项目.SpringBoard主页底部的圆点展示了应用这类控件的一个示例.令人遗憾的是,UIPageControl类在使用时令人失望.它的实例处理起来很笨拙,难以点按,一般会使用户感到恼怒.因此,在使用它时,确保添加替代的导航选项,使得页面控件更多地作为一种指示器,而较少作为一个控件. 图2-9显示了具有3个页面的页面控件.在当前色调明快的页面指示器的左边或右边点

《iOS 6核心开发手册(第4版)》——2.1节UIControl类

2.1 UIControl类 iOS 6核心开发手册(第4版) 在iOS中,控件(control)指为用户界面设计的预建对象库的成员.控件包括按钮和文本框.滑块和选项开关,以及其他Apple提供的对象.控件的作用是把用户交互转换为回调.用户触摸和操纵控件,并以此与应用程序通信. UIControl类位于控件类树的根部.控件是UIView的子类,它们都继承它的所有用于显示和布局的属性.子类添加了一种响应机制,用于增强视图的交互性. 当用户与控件的界面交互时,所有的控件都会实现一些方式来发出消息.控

《iOS 6核心开发手册(第4版)》——2.9节处理选项开关和步进器

2.9 处理选项开关和步进器 iOS 6核心开发手册(第4版) UISwitch对象提供了一个简单的启用/禁用开关,允许用户选择一个布尔值(对于大多数非英语地区,选项开关国际化为1/0).选项开关对象包含单个(可设置的)值属性,称为on.它将返回YES或NO,这取决于控件的当前状态.可以以编程方式更新选项开关的值,其方法是直接更改属性值或者调用setOn:animated:,其中后者提供了一种方式以动画展示所做的更改. 在这个示例中,当选项开关更新时,它会更改视图控制器的标题.IB提供了相对较少