1

I am writing an app that user can draw on uiview. It works perfect if that uiview is in normal size (let say 1024 x 720). However, if I add that into uiscrollview and that dimension is 1024 x 3000, it become very slow. Also, if the height is 10000, the app crash on the spot. I would like to know how to do.

- (void) drawRect: (CGRect) rect
{
    NSLog(@"drawrect here 1");

if (self.arrayStrokes)
{
    int arraynum = 0;
    // each iteration draw a stroke
    // line segments within a single stroke (path) has the same color and line width
    for (NSDictionary *dictStroke in self.arrayStrokes)
    {
        NSArray *arrayPointsInstroke = [dictStroke objectForKey:@"points"];
        UIColor *color = [dictStroke objectForKey:@"color"];
        float size = [[dictStroke objectForKey:@"size"] floatValue];
        [color set];        // equivalent to both setFill and setStroke

        //          // won't draw a line which is too short
        //          if (arrayPointsInstroke.count < 3)  {
        //              arraynum++; 
        //              continue;       // if continue is executed, the program jumps to the next dictStroke
        //          }

        // draw the stroke, line by line, with rounded joints
        UIBezierPath* pathLines = [UIBezierPath bezierPath];
        CGPoint pointStart = CGPointFromString([arrayPointsInstroke objectAtIndex:0]);
        [pathLines moveToPoint:pointStart];
        for (int i = 0; i < (arrayPointsInstroke.count - 1); i++)
        {
            CGPoint pointNext = CGPointFromString([arrayPointsInstroke objectAtIndex:i+1]);
            [pathLines addLineToPoint:pointNext];
        }
        pathLines.lineWidth = size;
        pathLines.lineJoinStyle = kCGLineJoinRound;
        pathLines.lineCapStyle = kCGLineCapRound;
        [pathLines stroke];

        arraynum++;
    }
}
}
4

3 回答 3

1

提供的代码示例中没有任何明显的东西会导致非常大的视图出现问题。我做了一个快速测试,并在没有任何事故的情况下绘制了 1024 x 10,000 的视图。我通过 Instruments 对此进行了演绎,结果非常令人满意:

分配

您应该通过 Instruments 运行您的应用程序,并且 (a) 确保您没有泄漏;(b) 查看分配并确保其水平。如果它在您身上增长,您应该确定是什么导致了这种增长(通过option- 在分配窗口中拖动或执行 heapshots)。大量问题可能导致分配增长(CGRelease某些核心基础对象失败、上下文开始/结束不匹配等),所以我犹豫猜测您的问题可能是什么。在您提供的代码示例中,我没有看到任何明显的内容。我只建议通过静态分析器(“产品”菜单上的“分析”)运行您的代码,看看它是否能识别任何东西。

现在,可能有问题的是将其保存为UIImageusingrenderInContextUIGraphicsGetImageFromCurrentImageContext(). 您还没有说您正在这样做,但是尝试创建/保存图像会在这些大小下消耗惊人的内存量。

如果您不熟悉使用 Instruments 追踪内存问题,我建议您观看 WWDC 2012 视频iOS App Performance: Memory。这是一个很好的主题入门。

于 2013-09-29T21:31:24.703 回答
0

如果手机不允许您创建比这更大的 CGrect,这是有原因的,如果手机内存不足,您几乎无能为力,请尝试使用不同的解决方案解决您的问题,但手机的内存是有限的,你不能滥用。

于 2013-09-29T18:53:25.010 回答
0

这是因为 UIView 在你实现-drawRect:函数时会分配内存。

这就是答案 在 UIScrollView 的子视图中绘制网格会分配巨大的内存

于 2016-07-19T10:11:14.427 回答