iPhone - 如何在视图中绘制内容

时间:2011-02-13 00:17:39

标签: iphone graphics view clipping rect

我得到了这段代码:

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:我想删除简单改变背景颜色的画面,它就完成了......

2 个答案:

答案 0 :(得分:2)

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

我不明白你的意思:

  

我不介意关于drawRect,我不是   继承任何东西

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

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

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

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

答案 1 :(得分:0)

我可能会建议您查看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]

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