如何在两个独立的图层上绘制iOS、coregraphics

如何在两个独立的图层上绘制iOS、coregraphics,ios,cocoa-touch,core-graphics,quartz-graphics,Ios,Cocoa Touch,Core Graphics,Quartz Graphics,我需要帮助来画这样的东西: 我被告知灰色背景条和紫色背景条应该在不同的图层上绘制。然后,这里的点表示一本书的章节(这个滑块就是关于这个章节的)将位于这两个章节之上的一层 我已经完成了在活动条上创建渐变并按如下方式绘制的任务: - (void)drawRect:(CGRect)rect{ self.opaque=NO; CGRect viewRect = self.bounds; //NSLog(@"innerRect width is: %f", innerRect.

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

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

我已经完成了在活动条上创建渐变并按如下方式绘制的任务:

- (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);
}
-(void)drawRect:(CGRect)rect{
self.不透明=否;
CGRect viewRect=self.bounds;
//NSLog(@“innerRect宽度为:%f”,innerRect.size.width);
CGFloat perPageWidth=viewRect.size.width/[self.model.book.totalPages floatValue];
NSLog(@“每页宽度为:%f”,每页宽度);
CGContextRef context=UIGraphicsGetCurrentContext();
UIBezierPath*beizerPathForSegment=[UIBezierPath bezierPath];
NSArray*arrayFromReadingSessionsSet=[self.model.readingSessions AllObject];
NSArray*ArrayFromAssessmentSet=[self.model.studentAssessments allObjects];
NSLog(@“数组为:%@”,self.model.readingSessions);
CGGradientRef梯度=[自梯度];

对于(int i=0;i,我猜您交谈的对象是指的人。在iOS中,每个视图都有一个CALayer作为后盾。不要在视图中实现
-drawRect:
,请执行以下操作:

  • #导入
    任何您想使用此功能的地方
  • 使用视图的属性

  • 层的行为非常类似于视图,因为您可以拥有子层和超层,层具有诸如背景色之类的属性,并且可以设置动画。对于您的目的可能有用的两个子类是和。有关如何使用层的更多信息,请参阅。

    我无法对此代码进行太多更改。这是实际上,由于平滑度的原因,梯度必须是CG。有没有一种方法可以在一个层上实现这一点?整个CG的事情,也就是说?你可以将你现有的代码移植到CALayer的方法中,但这会破坏层的目的,层使用基于GPU的合成以获得更好的性能e而不必一直手工重画图形。但是,对于这样简单的事情,
    -drawRect:
    可能是合适的。请记住将
    -drawRect:
    (CGRect)rect
    参数与
    [UIView setNeedsDisplayInRect:]
    ,只重新绘制视图中已更改的部分。谢谢你的回复,泽夫。我对绘图本身非常陌生。你能帮我举个例子吗?创建一个图层,然后在上面绘图,然后在上面创建另一个图层,然后在上面绘图。我知道我可能要求太多了,但我真的希望他能这样做再者,我知道我们可以把一个图层放在另一个图层上,但是我们实际上如何像在代码中那样画一个特定的图层。我的代码片段中的一两行代码转换成分层类型就足够了。