- (void)drawRect:(CGRect)rect{
float sliceSize = rect.size.width / imagesShownAtOnce;
//Apply our clipping region and fill it with black
[clippingRegion addClip];
[clippingRegion fill];
//Draw the 3 images (+1 for inbetween), with our scroll amount.
CGPoint loc;
for (int i=0;i<imagesShownAtOnce+1;i++){
loc = CGPointMake(rect.origin.x+(i*sliceSize)-imageScroll, rect.origin.y);
[[buttonImages objectAtIndex:i] drawAtPoint:loc];
}
//Draw the text region background
[[UIColor blackColor] setFill];
[textRegion fillWithBlendMode:kCGBlendModeNormal alpha:0.4f];
//Draw the actual text.
CGRect textRectangle = CGRectMake(rect.origin.x+16,rect.origin.y+rect.size.height*4/5.6,rect.size.width/1.5,rect.size.height/3);
[[UIColor whiteColor] setFill];
[buttonText drawInRect:textRectangle withFont:[UIFont fontWithName:@"Avenir-HeavyOblique" size:22]];
}
clippingRegion
和textRegion
UIBezierPaths
为我提供了我想要的圆角矩形(首先是裁剪区域,第二个是我文字的叠加)
中间部分正在绘制3个图像并让它们一起滚动,我每次刷新CADisplayLink
时都会更新,这会通过调用[self setNeedsDisplay]
使绘图区域无效,并且还会增加我的imageScroll变量
现在已经完成了背景信息,这是我的问题:
它运行,甚至运行顺利。但它占用了绝对高的CPU时间(80%+)!!如何将其关闭到手机上的GPU?有人告诉我有关CALayers的事情,但我从来没有处理过它们
答案 0 :(得分:4)
将绘图的每个组件绘制成某个(视图或图层)并让它保持缓存图形。然后你就可以移动或转换每个组件,正如你所说,它完全由GPU完成。
您可以使用单个视图或单个图层执行此操作,但这并不重要(视图 是一个层,在引擎盖下)。关键在于,当您真正想要的是移动相同的持久碎片时,不需要不断地从头开始重绘。
了解CALayer会是一个好主意,因为它实际上是iOS上所有绘图的基础。知道什么比这更重要?