在 UIViewController 上画一条线

Posted

技术标签:

【中文标题】在 UIViewController 上画一条线【英文标题】:Draw a line over UIViewController 【发布时间】:2010-06-09 06:14:24 【问题描述】:

我在 iPhone 上有一个带有 UIViewController 的应用程序,里面有一些东西......图像、文本框等...... 有没有办法直接在 UIViewController 内使用 opengl 画一条线或类似的东西?

提前致谢

【问题讨论】:

为什么只需要OpenGL来画一条线?为什么不直接使用 UIView? 例如,如何在图像上的 UIViewController 中画一条线? 【参考方案1】:

你确定是 OpenGL 吗?

我相信在常规视图之上使用 OpenGL 是不可能的。

您可以在所有其他视图之上添加一个自定义视图(从 UIView 继承)并在该视图上绘制您想要的任何内容。 此视图应具有透明背景色。 此外,如果您想与其他视图交互(点击按钮、编辑文本视图、滚动等),那么您必须在自定义视图中实现 hitTest 方法,以便将触摸事件传递给位于的视图在这个...

编辑:不要乱用 hitTest。只需取消选中 XIB 中启用的用户交互...

编辑:代码示例:

@interface TransparentDrawingView : UIView 
    CGPoint fromPoint;
    CGPoint toPoint;

- (void)drawLineFrom:(CGPoint)from to:(CGPoint)to;
@end

@implementation TransparentDrawingView

- (void)initObject 
    // Initialization code
    [super setBackgroundColor:[UIColor clearColor]];

- (id)initWithFrame:(CGRect)frame 
    if (self = [super initWithFrame:frame]) 
        // Initialization code
        [self initObject];
    
    return self;

- (id)initWithCoder:(NSCoder *)aCoder 
    if (self = [super initWithCoder:aCoder]) 
        // Initialization code
        [self initObject];
    
    return self;


- (void)drawRect:(CGRect)rect 
    // Drawing code

    // Draw a line from 'fromPoint' to 'toPoint'

- (void)drawLineFrom:(CGPoint)from to:(CGPoint)to 
    fromPoint = from;
    toPoint = to;

    // Refresh
    [self setNeedsDisplay];


@end

【讨论】:

谢谢迈克尔......我的目标是在图像上画一条线......谢谢 查看我添加到答案中的代码示例。将此视图用作您的自定义视图,该视图将传播到其余视图之上的整个窗口。在drawRect:方法中填写绘图代码...【参考方案2】:

首先我认为你应该知道 UIView 和 UIViewController 的职责。 UIView主要负责绘图(覆盖touchBegin、ToucheMove等)、动画、管理子视图、处理事件; UIViewController 主要负责加载、卸载视图等。

因此,您应该在自定义视图 (UIView) 上“绘制”这条线,而不是视图控制器。

第二:如果只需要显示一些简单的形状或线条。我建议您使用 UI 控件和图像。甚至不推荐使用“drawRect”,因为它会导致使用更多资源。当然OpenGL需要很多资源。

【讨论】:

您可以将视图拖动为任何形状,例如100像素宽,1像素高的矩形,将其背景颜色设置为黑色。它应该看起来像一条线。 :) 然后你可以把这条“线”作为你的 imageview 的子视图。 ghiboz,在这种情况下,我认为您应该改用 PNG。我建议的原则是:使您的解决方案尽可能简单。我们应该避免使用复杂的方法来解决简单的问题。 :) 我并不是说不应该使用 OpenGL。另一方面,它是一个非常强大的工具,但不是那么容易处理,并且会占用大量系统资源。【参考方案3】:

答案很简单,你必须创建一个扩展 UIView 的新类,并重写 drawRect 函数才能绘制(使用 Quartz...)你的线条。如果您也想要渐变背景,请使用此方法。

我也在使用 Adob​​e Flex 4 进行开发,我注意到 iPhone SDK 没有像 Flex 4 那样的皮肤和布局“模式”(例如,UIView 可能有一个皮肤(在一个单独的文件中......)和一个布局(水平、垂直、平铺......)),对我来说这是一个可怕的缺乏!

开源库 Three20 试图将其引入 iPhone SDK。

【讨论】:

以上是关于在 UIViewController 上画一条线的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fabric.js 在画布上画一条线

HTML5 Canvas - 如何在图像背景上画一条线?

在 svg 图像上画一条线

在透明的 qt 小部件上画一条线

ios如何在drawrect方法中在图像上画一条线

在现代 OpenGL 中画一条线