我正在使用NSTimer刷新5个上下文并将它们粘贴到每个.03秒的5个视图中。这在模拟器中运行良好,并以很高的帧速率运行,但是当部署在iPod上时会突然出现。我把费率降到了.1,但收效甚微。是否有更有效的方法来重绘这些上下文?
一些代码:
- (void)addViews{
[self.superview addSubview:mag];
[self.superview addSubview:vc];
[self.superview addSubview:na];
[self.superview addSubview:wave];
[self.superview addSubview:mon];
[self.superview addSubview:selector];
looper = [NSTimer timerWithTimeInterval:0.03
target:self
selector:@selector(setNeeds)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:looper forMode:NSRunLoopCommonModes];
}
-(void)setNeeds{
[mag setNeedsDisplay];
[vc setNeedsDisplay];
[na setNeedsDisplay];
[wave setNeedsDisplay];
[mon setNeedsDisplay];
}
这是应用于每个视图的上下文调整。基本上是一个放大镜。
- (void)drawRect:(CGRect)rect {
CGPoint magnifiedPoint = [viewToMagnify convertPoint:coordPoint fromView:self.superview];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context,(self.frame.size.width*0.5),(self.frame.size.height*0.5));
CGContextScaleCTM(context, 1.3, 1.3);
CGContextTranslateCTM(context,-1*(magnifiedPoint.x),-1*(magnifiedPoint.y));
[self.viewToMagnify.layer renderInContext:context];
}
答案 0 :(得分:1)
核心图形绘制相对较慢,因为它不是使用OpenGL进行硬件加速。除了最琐碎的绘图之外,Core Graphics对于iOS上的实时动画来说太慢了。
核心动画速度更快,因为它使用OpenGL硬件加速。我建议尽可能使用Core动画来达到你的效果。每个UIView都有一个CALayer支持,因此您直接应用于view.transform属性的任何变换都将非常快。您还可以通过设置view.layer.mask属性来动态屏蔽视图。
也许您可以通过缩放视图本身(或具有相同内容的视图副本)并将其遮盖为圆形来模拟放大效果。这样你就不必调用renderInContext或者做任何CGContext绘图,整个事情应该以合适的帧速率运行。