1

为什么有人会继承 UIView 而不是像这样创建我们自己的自定义视图:

CGRect labelRect = CGRectMake(20,20,20,20); //Frame to contain the current view
UILabel *label  = [[UILabel alloc] initWithFrame:labelRect];
label.text = @”This is a custom view with out subclassing UIView”
[self.view addSubView:label];

是看不到任何权衡或优势吗?我错过了什么吗?

4

3 回答 3

2

在很多情况下,您只是重新排列文本,并使用一些内置按钮、标签等;不需要子类 aUIView而是可以通过 a 以编程方式完成UIViewController或添加到故事板/nib 文件中。但是,一个很好的例子说明何时以及为什么要对 a 进行子类化UIView是,如果您想向正在使用的视图添加一些自定义触摸行为或绘图。

所以在我看来,子类化 a 的主要考虑因素UIView如下:

1)触摸交互,

2) 自定义绘图

*请注意,可能还有其他原因,您可能希望仅从程序组织的角度创建视图子类,但这是不能将行为委托给另一个函数或直接添加到UIView. 例如,对一般动画和背景图像操作的支持都可以在没有子类化的情况下处理UIView

触摸交互- 与 a 的触摸交互UIView可以通过几种不同的方式进行处理,您可以直接与触摸事件交互,或者将手势识别器添加到UIView. 在许多情况下,您可以通过手势识别器(或自定义手势识别器)完成所需的一切,而不是尝试查看视图上发生的单个触摸,但如果您想要/需要访问原始触摸事件,您将覆盖以下函数以实现所需的行为:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

自定义绘图-UIView您可以通过 Quartz/Core Graphics 进行基本的 2D 绘图。一个例子是,如果您正在做一个绘图应用程序,并希望您UIView在熨平板上的上下文中为您绘制实际线条。为此,您将覆盖该drawRect:(CGRect)rect 函数并在此处列出任何自定义绘图。

话虽如此,这绝不是您可以绘制线条的唯一方法,并且可以在不执行自定义绘图的情况下完成此任务。例如,同一条线或一组线可以由您的 绘制到图像缓冲区中UIViewController,然后相应地显示为您的视图或子视图的背景。然而,当这样做时,UIView屏幕上的线条会丢失,直接与该线条的触摸交互变得更具挑战性。最后,请记住,有一些创造性的方法可以绕过子类化以显示自定义绘图,但有时从程序设计的角度来看,创建子类可能更有意义UIView

这些绝不是您想要将 a 子类化的唯一原因UIView,但却是我所见过的用于创建 的子类的两个最大原因UIView。我建议您查看UIView 类参考iOS 的 View Programming Guide了解更多详细信息。

于 2012-05-17T06:04:32.133 回答
0

出于同样的原因,UIView 是 UIKit 中的控件和文本布局视图的子类:因为现有的实现并不能做所有事情,并且需要自定义实现或成员(有时)。

但是,在这种情况下,如果您需要做一些特定的事情,或者重用一个实现并且子类化是一个很好的解决方案,您可以在这种情况下子类化 UILabel。

于 2012-05-17T04:50:05.150 回答
0

我会说自定义行为和自定义布局。从外部控制器处理超出自动调整大小掩码或智能加载子视图的调整大小更困难。

我创建了一个自定义图像视图,它有一个滚动视图,可以在三列显示中查看一长串图像。它在内部管理图像,因此它只加载屏幕上显示的图像的视图。

您能想象必须通过手动将滚动视图与单元格组合来构建 UITableView,管理单元格视图的队列,必须仅在单元格出现时才智能加载单元格,并且每次处理所有点击、滑动和平移手势需要具有表格外观的屏幕?

于 2012-05-17T05:36:39.493 回答