我想画 31 个不同笔画宽度的圆圈。在我看来,我不能重用它,因为我无法缩放它,所有圈子都有不同的选择。这些视图不是静态的,当我推动我的视图控制器时,我总是必须重新绘制它。
更新部分:
这是我drawRect:
在CircleView.m中的方法的 Time Profiler 的屏幕截图,当我转换到具有 31 个圆圈的视图时:
按照计划,用户会经常交换视图,每次都等待重绘变得很烦人。
我有几个自定义容器视图。另外约 30% 的时间用于从情节提要中加载视图。尽管如此,我还是觉得很奇怪,因为现在OtherTimeWasteView只有一个subView:DatePickerView,但是根据TProfile的运行时间是84ms,100%都花在了[super loadView]
方法上。
我的天真(?)优化尝试:
我之前尝试过一次加载这个视图,将它存储在 parentViewController“combinedViewController”中并一直重复使用它。我在CircleView.h添加了属性:
@property (strong,nonatomic) UIImage *imageCircle;
然后我通过添加调用方法 对CircleView.m进行了一些更改:-createImage
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.imageCircle=[self createImage];
}
return self;
}
-(UIImage*)createImage
{
CGSize size=self.frame.size;
UIGraphicsBeginImageContextWithOptions(size, NO, 1.0);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
self.brush=0.6;
CGRect frameOfCircle=CGRectMake(self.brush/2,self.brush/2, self.frame.size.width-self.brush-1.0f, self.frame.size.height-self.brush);
// Draw a circle (border only)
CGContextSetLineWidth(contextRef, self.brush);
CGFloat mainColor[4]={23.0f/255.0f, 12.0f/255.0f, 0.0f, 0.5};
CGContextSetStrokeColor(contextRef, mainColor);
CGContextStrokeEllipseInRect(contextRef, frameOfCircle);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
combineViewController.m:
这是我尝试在可见区域之外初始化前 10 个圆圈:
-(void)createCircles
{
self.arrayOfCircles=[[NSMutableArray alloc]init];
for (int i=0; i<10; i++)
{
[self.arrayOfCircles addObject:[self circleViewWithRadius:530+i*35 withBrush:5+i tag:1014+i alphaParam:0.60]];
}
}
我想在 CirclesViewController.m 中添加Subview:
-(void)addCircles
{
CombinedViewController *parentVC=(CombinedViewController*)[self parentViewController];
for (int i=0; i<10; i++)
{
CircleView *circle=(CircleView*)[parentVC.arrayOfCircles objectAtIndex:i];
UIImageView *imgv=[[UIImageView alloc]initWithImage:circle.imageCircle];
imgv.center=CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2);
[self.view insertSubview:imgv belowView:someView];
}
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self addCircles];
}
a)不幸的是,如果我尝试第二种方法,则没有添加任何圆圈。我用断点调试,arrayOfCircles 不是 nil,circle 的 image 属性也不是 nil。但是,在我看来仍然没有圈子。我的代码有什么错误吗?
b)通过提前从 CGContext 获取图像来优化性能是否合适?如果不是,我恳请您忽略我的“a”问题,并提供一些如何正确获得高性能的提示。
太谢谢了!
UPDATE2:
链接:http ://i.stack.imgur.com/EstBG.png
http://i.stack.imgur.com/uAjSJ.png
http://i.stack.imgur.com/Kw0cz.png