1

    我想画 31 个不同笔画宽度的圆圈。在我看来,我不能重用它,因为我无法缩放它,所有圈子都有不同的选择。这些视图不是静态的,当我推动我的视图控制器时,我总是必须重新绘制它。

更新部分:

    这是我drawRect:CircleView.m中的方法的 Time Profiler 的屏幕截图,当我转换到具有 31 个圆圈的视图时:

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

4

0 回答 0