我想绘制31个不同笔画宽度的圆圈。在我看来,我无法重复使用它,因为我无法扩展它,所有圈子都有不同的选择。这些视图不是静态的,当我按下视图控制器时,我总是需要重绘它。
更新部分:
当我转换到包含31个圈子的视图时,以下是我在{strong> CircleView.m 中drawRect:
方法的时间分析器截图:
按照计划,用户会大量交换视图,每次等待重绘都会很烦人
我有几个自定义容器视图。另外~30%的时间从故事板转到loadingView。不过,这对我来说似乎很奇怪,因为现在其他TimeWasteView只有一个subView:DatePickerView,但是根据TProfile的运行时间是84ms而100%花在了[super loadView]
方法上。
MY NAIVE(?)尝试优化:
我尝试先将此视图加载一次,将其存储在parentViewController“combinedViewController”中并一直重复使用。我在 CircleView.h :
中添加了属性@property (strong,nonatomic) UIImage *imageCircle;
然后我通过添加调用-createImage
方法改变了一点 CircleView.m :
- (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;
}
combinedViewController.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中添加子视图:
-(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