如何在两个单独的图层上绘制iOS,coregraphics

Posted

技术标签:

【中文标题】如何在两个单独的图层上绘制iOS,coregraphics【英文标题】:How to draw on two separate layers iOS, coregraphics 【发布时间】:2012-11-26 15:17:40 【问题描述】:

我需要帮助来绘制这样的东西:

有人告诉我灰色背景条和紫色条应该绘制在不同的图层上。然后那里的点表示一本书的章节(这个滑块是关于)将在这两个之上的一层。

我已经完成了在活动栏上创建渐变并绘制它的任务:

- (void)drawRect:(CGRect)rect
    self.opaque=NO;

    CGRect viewRect = self.bounds;
    //NSLog(@"innerRect width is: %f", innerRect.size.width);
    CGFloat perPageWidth =  viewRect.size.width/[self.model.book.totalPages floatValue];
    NSLog(@"perpage width is: %f", perPageWidth);
    CGContextRef context = UIGraphicsGetCurrentContext();

    UIBezierPath *beizerPathForSegment= [UIBezierPath bezierPath];

    NSArray *arrayFromReadingSessionsSet =[self.model.readingSessions allObjects];
    NSArray *arrayFromAssesmentSet = [self.model.studentAssessments allObjects];
    NSLog(@"array is : %@", self.model.readingSessions);

    CGGradientRef gradient = [self gradient];



    for (int i=0;i<[arrayFromReadingSessionsSet count]; i++) 

        ReadingSession *tempRSObj= [arrayFromReadingSessionsSet objectAtIndex:i];
        CGFloat pageDifference = [tempRSObj.endPage floatValue]-[tempRSObj.startPage floatValue];
        NSLog(@"startpage is: %@, end page is: %@, total pages are: %@", tempRSObj.startPage, tempRSObj.endPage, self.model.book.totalPages) ;


        CGRect ProgressIndicator = CGRectMake(perPageWidth*[tempRSObj.startPage floatValue], viewRect.origin.y, perPageWidth*pageDifference, viewRect.size.height);


       [beizerPathForSegment appendPath:[UIBezierPath bezierPathWithRoundedRect:ProgressIndicator cornerRadius:13.0]];

[beizerPathForSegment addClip];

    CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX([beizerPathForSegment bounds]), CGRectGetMaxY([beizerPathForSegment bounds])),CGPointMake(CGRectGetMidX([beizerPathForSegment bounds]), 0), (CGGradientDrawingOptions)NULL);

如何将其转移到一个图层上,然后创建另一个图层和另一个图层,然后将它们叠加在一起?

TIA

【问题讨论】:

【参考方案1】:

我猜与您交谈的人指的是CALayer。在 ios 中,每个视图都有一个 CALayer 支持它。不要在您的视图中实现-drawRect:,而是这样做:

    link with QuartzCore #import &lt;QuartzCore/QuartzCore.h&gt; 任何你想使用它的地方。 用于视图的 layer 属性。

图层的行为很像视图,因为您可以有子图层和超级图层,并且图层具有背景颜色等属性,并且它们可以设置动画。 CAGradientLayerCAShapeLayer 可能对您的目的有用的几个子类。有关如何使用图层的更多信息,请参阅Core Animation Programming Guide。

【讨论】:

我无法对这段代码进行大量更改。它实际上已根据需要进行了相当大的调整,并且由于平滑度,渐变必须是 CG 之一。有没有办法只在一层上做到这一点?整个 CG 的东西,是吗? 您可以将现有代码移植到 CALayer 的 -drawInContext: 方法,但这会破坏使用图层执行此操作的目的,图层使用基于 GPU 的合成来获得更好的性能,而无需通过重新绘制图形手。但是,对于这样简单的事情,-drawRect: 可能是合适的。 请记住将-drawRect:(CGRect)rect 参数与[UIView setNeedsDisplayInRect:] 结合使用,以仅重绘视图中已更改的部分。 感谢您的回复,泽夫。我对绘画本身很陌生。你能帮我举个例子吗?创建一个图层,然后在其上绘图,然后在其上创建另一个图层并在其上绘图,即。我知道我可能要求太多,但我真的希望在这里! 另外,我知道我们可以将一个图层放在另一个图层上,但是我们实际上如何像在代码中为特定图层所做的那样进行绘图。将我的 sn-p 中的一两行代码转换为分层类型就足够了。

以上是关于如何在两个单独的图层上绘制iOS,coregraphics的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:在两个不同的图层上同步动画

在mapbox gl js中的图层上注册点击事件时如何操作事件冒泡

ps中间翻页翻页左右两个图片颜色不一样的那种效果图怎么制作?

在 Photoshop 中的图层上显示轮廓

arcmap中如何把一个图层中的要素复制到另一个图层上

arcgis开始编辑后不能画线