Как исправить проблемы с производительностью длинных графиков в drawRect для устройств iOS с высоким разрешением? - PullRequest
0 голосов
/ 30 мая 2019

В моем приложении отображается длинный график, на котором ось X помечена годами в диапазоне от 400 до 2100. График отображается в виде UIView и добавляется как вспомогательное представление в UIScrollView. Ось нарисована с помощью маркеров года с использованием CGContextRef в drawRect, как упомянуто в этой ссылке .

Из-за длинной оси ширина рамки графика (UIView) установлена ​​на 10000. Этот график без проблем отображается на устройствах со средним разрешением экрана, таких как iPad 2. Однако, когда этот график открывается в устройствах с высоким разрешением, таких как iPad Air, возникают проблемы. как фон не прорисован (стал прозрачным) и при прокрутке весь график становится грязным из-за перерисовки содержимого без удаления ранее нарисованного содержимого.

Даже я вызывал следующие методы в делегате 'setFrame', но бесполезно.

[self setNeedsLayout];
[self setNeedsUpdateInRect:self.frame]; 

Может кто-нибудь предложить эффективную графику рисования графики в drawRect для повышения производительности устройств с высоким разрешением?

Ниже приведен мой код в делегате drawRect:

CGContextRef context = UIGraphicsGetCurrentContext();
[self.layer renderInContext:context];

CGPoint startPoint = CGPointMake(graphEndPadding, graphBaselineY);
CGContextMoveToPoint(context, startPoint.x, startPoint.y);

//Create line from starting point to end point
CGPoint endPoint = CGPointMake(graphLengthPixels+graphEndPadding, graphBaselineY);
CGContextAddLineToPoint(context, endPoint.x, endPoint.y);

//Create hashmark point system
CGFloat currX = startPoint.x;
CGFloat yVal = startPoint.y + graphHashMarkLength;

//Draw hashmarks
int count = 0;
while(currX <= endPoint.x) {
    //Draw hashmark
    CGContextMoveToPoint(context, currX, graphBaselineY);
    CGContextAddLineToPoint(context, currX, yVal);

    //Move to next hashmark
    currX += pixelYearIncrement;
    count++;
}

//Draw x-axis
CGContextSetLineWidth(context, 1);
CGContextSetLineCap(context, cgLineCapSquare);
CGContextSetRGBStrokeColor(context, 0.7765, 0.6118, 0.4275, 1.0);
CGContextStrokePath(context);
...