我正在编写一个用户可以在uiview上绘制的应用程序。如果该uiview的尺寸为常规尺寸(例如1024 x 720),则效果最佳。但是,如果我将其添加到uiscrollview中,并且尺寸为1024 x 3000,它将变得非常慢。另外,如果高度为10000,则应用程序将当场崩溃。我想知道该怎么做。
- (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++;
}
}
}
最佳答案
提供的代码示例中没有什么明显的问题会导致非常大的视图出现问题。我进行了快速测试,并绘制了1024 x 10,000的视图,没有任何事件。我通过Instruments对此进行了翻译,结果令人惊奇地令人惊奇:
您应该通过Instruments运行您的应用程序,并且(a)确保没有泄漏; (b)查看分配并确保其水平。如果您正在增长,则应确定是什么导致了这种增长(通过在分配窗口中拖动选项或进行堆快照)。大量的问题可能导致分配增加(无法对某些Core Foundation对象进行CGRelease
编码,上下文的开始/结束不匹配等),所以我犹豫要猜测出您的问题可能是什么。在您提供的代码示例中,我看不到任何明显的东西。我只建议通过静态分析器(“产品”菜单上的“分析”)运行代码,看看它是否能识别出任何东西。
现在,可能会出现问题的是使用UIImage
和renderInContext
将其保存为UIGraphicsGetImageFromCurrentImageContext()
。您没有说要这样做,但是尝试创建/保存图像将以这些大小消耗惊人的内存。
如果您不熟悉使用Instruments来跟踪内存问题,建议您观看WWDC 2012视频iOS App Performance: Memory。这是该主题的很好的入门。
关于ios - 在非常大的uiview中使用drawrect并且内存不足,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19081421/