65.9K
CodeProject 正在变化。 阅读更多。
Home

ScratchPadView for iOS (使用 GLKit)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (5投票s)

2012年11月27日

CPOL

4分钟阅读

viewsIcon

25356

downloadIcon

451

一个可以添加到您项目的 GLKView 类。

  • 下载演示项目 - 由于 Apple 许可原因,演示项目不存在,但使用源代码很容易构建。
  • 下载源代码 - 163 KB

Sample Image

引言

这个类基本上是我 iOS 应用 AKW 因子树中的代码。它允许用户在设备上进行草稿(数学)工作,而不是使用纸张。该类提供了您在图像中看到的所有功能:颜色更改、撤消/重做、清除、拖动/调整大小、重播触摸以及隐藏/显示草稿板。正如标题中提到的,此类使用 GLKit,该工具仅适用于 iOS 5.0 及更高版本。

这个类的想法来自 Apple 提供的 GLPaint。但是,所有代码都是原创的,因为功能完全不同:OpenGL 用于整个屏幕,而我需要部分屏幕解决方案。因此,我使用 GLKit 创建了一个解决方案。我为什么要提供这段代码?如果您正在创建可发布的应用程序,那么 iOS 的学习曲线非常陡峭,如果没有活跃的在线社区提供解决方案和教程来解决我必须克服的许多障碍(我的很多帮助来自 StackOverflow;Ray Wenderlich 的网站也很有用),我的应用程序发布将花费更多时间。因此,我通过提供此代码回馈社区。

此类唯一缺少的重要功能是屏幕旋转。但是,只需设置 2 个变量并调用绘图例程即可轻松实现。

此类旨在用作草稿板,但您可以轻松地将其转换为绘画或绘图;有很多关于这方面的教程。您可能需要的另一个功能是保存所有绘图数据。这很容易添加,因为它都存储在数组中,您可以使用自己的格式对其进行序列化。

另一个简单的功能是调整重播速度。我没有添加此功能,因为它只会使界面混乱。当然,您可以想到更多功能,但您必须决定是想要易于使用的功能还是向用户提供更多选项!

使用代码

我不经常使用 IB,因为我喜欢以编程方式做事。因此,这个类最适合以编程方式使用(在演示中,我确实用 IB 连接了它)应该不足为奇。在您的 UIView 中,您需要声明草稿板(在演示中,它是 *AppDelegate.h*)

#import "ScratchPadView.h"
...
@property (nonatomic, retain) ScratchPadView *spv;
...

接下来,在您的 UIView 中(在演示中,它是 *AppDelegate.m*),您需要在 `dealloc` 方法中释放草稿板

...
self.spv = nil;
...

在您的 UIView 初始化中(在演示中,它是 `application:didFinishLaunchingWithOptions:`),添加

...
ScratchPadView *s = [[ScratchPadView alloc] init];
self.spv = s;
[s release];
[self.viewController showScratchPad:nil];
...

最后,在您的 UI 处理程序中(在演示中,它是 *ViewController.m*。因为我为演示使用了 IB,所以下面的代码与项目中的代码不同),添加到您的显示草稿板按钮

if ([self.spv superview] == nil) {
	[self addSubview:self.spv];
	[self.spv scaleScratchUp];
}

使用代码 - 自定义

您可能想要调整的基本内容是缓冲区大小。默认值为 3000 条线段和 300 条线;您可以在 *ScratchPadView.h* 中找到这些内容。请注意,当任一缓冲区已满时,将向用户显示一条警报,询问他们是否要清除草稿板。

您可以通过查看 Apple 关于正在使用的变量和方法的文档来解读大部分代码。如果您是初学者,您可能不知道覆盖视图的 `drawInRect` 或 `drawRect` 将使用您的代码进行自定义绘图。因此,如果您希望将草图板的笔绘图更改为绘画,则 `glkView:drawInRect:` 是您想要修改的代码段。`glkView:drawInRect:` 通过清除屏幕然后绘制所有线条来工作。您可能认为这是低效的,但它实际上运行速度很快。我一直在寻找某种方法来访问后缓冲区,以便仅使用最后一条线段更新它,但这没有必要。

iPhone 屏幕空间很小,但如果您确实想要使草稿板可拖动和可调整大小,那么您需要通过删除 `!largeFormat` 代码来修改 `adjustNumPad`。

如果您想修改代码以更改重播模式的绘制速度,请查看 `replayInt`。请注意,触摸绘图表面将取消重播模式。

我不确定您是否需要修改其他代码部分,但如果您有任何疑问,请随时提出!

关注点

除了 GLPaint 之外,我还查看了 Cesar Manuel Pinto Castillo 编写的 SimplePaint。它不是我需要的,但它确实帮助了我学习。所以我向 Cesar 致敬!您可以在 github 上的 Simple-Paint-App-iOS 下找到他的代码。

在 GLKit 之前,我尝试使用 QuartzCore,但性能不是很好。触摸到绘图存在相当大的延迟。我一直在寻找一种直接绘制到后缓冲区而不是复制后缓冲区并在副本上绘制的方法。当草稿板较大时,它尤其慢。

历史

  • 2012 年 11 月 - 版本 1.0
© . All rights reserved.