如何在两个单独的图层上绘制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 <QuartzCore/QuartzCore.h>
任何你想使用它的地方。
用于视图的 layer
属性。
图层的行为很像视图,因为您可以有子图层和超级图层,并且图层具有背景颜色等属性,并且它们可以设置动画。 CAGradientLayer
和 CAShapeLayer
可能对您的目的有用的几个子类。有关如何使用图层的更多信息,请参阅Core Animation Programming Guide。
【讨论】:
我无法对这段代码进行大量更改。它实际上已根据需要进行了相当大的调整,并且由于平滑度,渐变必须是 CG 之一。有没有办法只在一层上做到这一点?整个 CG 的东西,是吗? 您可以将现有代码移植到 CALayer 的-drawInContext:
方法,但这会破坏使用图层执行此操作的目的,图层使用基于 GPU 的合成来获得更好的性能,而无需通过重新绘制图形手。但是,对于这样简单的事情,-drawRect:
可能是合适的。
请记住将-drawRect:
的(CGRect)rect
参数与[UIView setNeedsDisplayInRect:]
结合使用,以仅重绘视图中已更改的部分。
感谢您的回复,泽夫。我对绘画本身很陌生。你能帮我举个例子吗?创建一个图层,然后在其上绘图,然后在其上创建另一个图层并在其上绘图,即。我知道我可能要求太多,但我真的希望在这里!
另外,我知道我们可以将一个图层放在另一个图层上,但是我们实际上如何像在代码中为特定图层所做的那样进行绘图。将我的 sn-p 中的一两行代码转换为分层类型就足够了。以上是关于如何在两个单独的图层上绘制iOS,coregraphics的主要内容,如果未能解决你的问题,请参考以下文章
在mapbox gl js中的图层上注册点击事件时如何操作事件冒泡