ScrollView не хватает памяти, когда он становится слишком большим - PullRequest
1 голос
/ 25 ноября 2010

У меня есть приложение, которое предоставляет пользователю своего рода линейный график. Я использую UIScrollView, который содержит представление с графиком. Представление использует CoreGraphics для рисования графика в своем методе drawrect. Проблема возникает, когда график становится слишком длинным. Прокрутка графика кажется заикающейся, и в конце концов приложение исчерпает память и завершит работу. Оглядываясь на другие приложения, я вижу, что ребята, которые создали приложение WeightBot , смогли без проблем управлять длинными текущими графиками, поэтому, очевидно, я делаю это неправильно.

Мне было интересно, как создаются такие длинные линейные графики, не сталкиваясь с проблемами памяти?

РЕДАКТИРОВАТЬ: добавить код

По сути, все, что я делаю, - это инициализирую представление, которое строит график в его методе drawRect, и добавляю представление в качестве subView в scrollView.

Вот как реализуется drawRect представления:

- (void)drawRect:(CGRect)rect 
{
CGContextRef c = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(c, self.backgroundColor.CGColor);
CGContextFillRect(c, rect);

//... do some initialization 

 for (NSUInteger i = 0; i < xValuesCount; i++) 
    {
        NSUInteger x = (i * step) * stepX;

        NSUInteger index = i * step;

        CGPoint startPoint = CGPointMake(x + offsetX, offsetY);
        CGPoint endPoint = CGPointMake(x + offsetX, self.frame.size.height - offsetY);

        CGContextMoveToPoint(c, startPoint.x, startPoint.y);
        CGContextAddLineToPoint(c, endPoint.x, endPoint.y);
        CGContextClosePath(c);

        CGContextSetStrokeColorWithColor(c, self.gridXColor.CGColor);
        CGContextStrokePath(c);
    }
}

Ответы [ 3 ]

1 голос
/ 26 ноября 2010

Большой вид (с методом рисования) занимает много памяти, даже если его суперпредставление мало. Ваше негабаритное подпредставление потребует огромного буфера.

Вместо этого просто создайте подкласс непосредственно из обзора uiscrolling. Скроллинг-просмотр такой же большой, как и его визуальная часть. Смещение автоматически учитывается при рисовании. Ваш метод рисования будет вызываться все время, но это должно быть хорошо.

1 голос
/ 26 ноября 2010

Аргумент rect, равный drawRect:, указывает, какую часть вашего представления вам предлагается нарисовать. Вы должны добавить некоторую логику, чтобы выяснить, какие части вашего графа находятся в этом прямоугольнике, и только нарисовать их, вместо того, чтобы перерисовывать все это при каждом вызове.

0 голосов
/ 26 ноября 2010

Выясните, какая часть вашего набора данных видима, и нарисуйте только то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...