【问题标题】:iPhone - How to draw something in a viewiPhone - 如何在视图中绘制一些东西
【发布时间】:2011-06-26 06:40:00
【问题描述】:

我有这段代码:

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat colors[] = {
    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
};
CGGradientRef gradientRef = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors) / (sizeof(colors[0]) * 4));
CGColorSpaceRelease(rgb);
CGContextRef context = UIGraphicsGetCurrentContext();

CGRect rect = theCell.backgroundView.bounds;                
CGPoint start = CGPointMake(rect.origin.x, 0);
CGPoint end = CGPointMake(rect.origin.x, rect.size.height/2);

CGContextDrawLinearGradient(context, gradientRef, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

我想知道如何让它绘制到指定的视图中,并将参数传递给我的函数的剪切矩形。提示:我不介意drawRect,我没有继承任何东西。

提示 2:我不想插入以后无法删除的任何图层。

提示 3:这段代码没有画出我眼睛能看到的任何东西..... :-( 缺少图形端口?

提示 4:我想擦除绘图,只需更改背景颜色,就完成了...

【问题讨论】:

  • 您可能不介意drawRect:,但操作系统会。在drawRect: 中画画。
  • @Ole Begemann:什么???世界上任何操作系统都允许您在指定的图形端口上绘制一些东西,而 Cocoa 不允许?甚至旧的 MacOS 也允许这样做......有什么问题?每次我想在某处画一条线时,我都必须对我的视图进行子类化?这听起来很疯狂!
  • 你可以只画到图形端口,但你必须使用openGL。不过,您不需要子类,您可以使用普通的旧 UIView 并通过在与其关联的层和上下文上调用 QuartzCore 函数从视图控制器进行绘图。

标签: iphone graphics view clipping rect


【解决方案1】:

CGContextRef context = UIGraphicsGetCurrentContext(); 将获取当前视图的图形上下文,因此如果您在 UIView 的 drawRect: 方法中调用它,它将绘制。

我不明白你的意思:

我不介意drawRect,我不介意 子类化任何东西

但如果你想进行自定义绘图,你必须覆盖 drawRect: 方法或使用图层。要使用层,您可以调用 CGContextRef context = CGLayerGetContext(theLayer); 而不是 CGContextRef context = UIGraphicsGetCurrentContext();

好的,所以我查看了文档,它说您可以通过从 drawRectMethod 调用 UIGraphicsGetCurrentContext() 来获取 CGContextRef。它是这么说的:在 iOS 应用程序中,您设置了一个 UIView 对象来绘制并实现 drawRect: 方法来执行绘制。在调用您的自定义 drawRect: 方法之前,视图对象会自动配置其绘图环境,以便您的代码可以立即开始绘图。作为此配置的一部分,UIView 对象为当前绘图环境创建图形上下文(CGContextRef 不透明类型)。您可以通过调用 UIKit 函数 UIGraphicsGetCurrentContext 来获取此图形上下文。您可以使用 UIGraphicsPushContext 和 UIGraphicsPopContext 函数保存和恢复图形上下文。

您可以在想要在视图以外的地方绘制的情况下创建自定义图形上下文对象。例如,您可能想要捕获一系列绘图命令并使用它们来创建图像或 PDF 文件。要创建上下文,请使用 CGBitmapContextCreate 或 CGPDFContextCreate 函数。获得上下文后,您可以将其传递给创建内容所需的绘图函数。

创建自定义上下文时,这些上下文的坐标系与 iOS 使用的原生坐标系不同。原点不是在绘图表面的左上角,而是在左下角,并且轴指向上方和右侧。您在绘图命令中指定的坐标必须考虑到这一点,否则生成的图像或 PDF 文件在渲染时可能会出现错误。有关使用 CGBitmapContextCreate 和 CGPDFContextCreate 的详细信息,请参阅“创建位图图形上下文”和“创建 PDF 图形上下文”。

【讨论】:

  • 你可以通过调用 `CGLayer *theLayer = theView.layer; 从 UIView 中获取图层。 `
  • @Rich : CGContextRef context = CGLayerGetContext((CGLayerRef*)theCell.layer);编译器说参数类型不好...并且不知道 CGLayer...
  • @Rich :我不想做自定义绘图。我只想在我的视野中某处画一条线、一个矩形或这里的渐变。
  • 不要使用指针。试试这个:`CGContextRef context = CGLayerGetContext((CGLayerRef)theCell.layer); `
  • 哦,很抱歉 layer 属性返回了一个 CALayer。
【解决方案2】:

我是否可以建议您查看 CAGradientLayer,并将其添加为视图的子层?简单得多,而且它会被硬件加速,这对表格单元很重要。

部分从这里被盗的示例:

http://tumbljack.com/post/188089679/gpu-accelerated-awesomeness-with-cagradientlayer

#import <QuartzCore/QuartzCore.h>  // Also import this framework
......
CAGradientLayer grad = [CAGradientLayer layer];

UIColor *colorOne     = [UIColor colorWithHRed:1.0f Green:1.0f Blue:1.0f alpha:1.0f];
UIColor *colorTwo     = [UIColor colorWithHRed:0.0f Green:0.0f Blue:0.0f alpha:1.0f];

NSArray *colors =  [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
grad.colors = colors;

CGRect rect = theCell.backgroundView.bounds; 
rect.size.height = rect.size.height / 2;
grad.frame = rect;
[self.layer addsublayer:grad]

您可能需要稍微调整一下颜色,不确定渐变是否倾斜...

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多