2012-03-18 2 views
0

Это мой CoreGraphics код:CoreGraphics занимает некоторое время, чтобы показать на большом экране - могу ли я заставить его повторять пиксели?

void drawTopPaperBackground(CGContextRef context, CGRect rect) { 

    CGRect paper3 = CGRectMake(10, 14, 300, rect.size.height - 14); 
    CGRect paper2 = CGRectMake(13, 12, 294, rect.size.height - 12); 
    CGRect paper1 = CGRectMake(16, 10, 288, rect.size.height - 10); 

    //Shadow 
    CGContextSetShadowWithColor(context, CGSizeMake(0,0), 10, [[UIColor colorWithWhite:0 alpha:0.5]CGColor]); 
    CGPathRef path = createRoundedRectForRect(paper3, 0); 
    CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]); 
    CGContextAddPath(context, path); 
    CGContextFillPath(context); 

    //Layers of paper 
    CGContextSaveGState(context); 

    drawPaper(context, paper3); 
    drawPaper(context, paper2); 
    drawPaper(context, paper1); 

    CGContextRestoreGState(context); 

} 

void drawPaper(CGContextRef context, CGRect rect) { 
    //Shadow 
    CGContextSaveGState(context); 

    CGContextSetShadowWithColor(context, CGSizeMake(0,0), 1, [[UIColor colorWithWhite:0 alpha:0.5]CGColor]); 

    CGPathRef path = createRoundedRectForRect(rect, 0); 
    CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]); 
    CGContextAddPath(context, path); 
    CGContextFillPath(context); 

    CGContextRestoreGState(context); 

    //Gradient 

    CGContextSaveGState(context); 

    CGColorRef startColor = [UIColor colorWithWhite:0.92 alpha:1.0].CGColor; 
    CGColorRef endColor = [UIColor colorWithWhite:0.94 alpha:1.0].CGColor; 

    CGRect firstHalf = CGRectMake(rect.origin.x, 
            rect.origin.y, rect.size.width/2, rect.size.height); 
    CGRect secondHalf = CGRectMake(rect.origin.x + (rect.size.width/2), 
            rect.origin.y, rect.size.width/2, rect.size.height); 

    drawVerticalGradient(context, firstHalf, startColor, endColor); 
    drawVerticalGradient(context, secondHalf, endColor, startColor); 

    CGContextRestoreGState(context); 

    CGContextSaveGState(context); 

    CGRect redRect = rectForRectWithInset(rect, -1); 
    CGMutablePathRef redPath = createRoundedRectForRect(redRect, 0); 


    CGContextSaveGState(context); 
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]); 

    CGContextAddPath(context, path); 
    CGContextClip(context); 

    CGContextAddPath(context, redPath); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 15.0, [[UIColor colorWithWhite:0 alpha:0.1] CGColor]); 
    CGContextStrokePath(context); 

    CGContextRestoreGState(context); 

} 

мнение является UIScrollView, который содержит TextView. Каждый раз, когда пользователь что-то вводит и переходит на новую строку, я вызываю [self setNeedsDisplay]; и перерисовывает код. Но когда представление начинает становиться длинным - около 1000 высоты, оно имеет очень заметное отставание. Как я могу сделать этот код более эффективным? Могу ли я взять линию пикселей и заставить ее просто повторить это, или растянуть его, вплоть до конца?

ответ

2

Вы можете нарисовать свой повторяющийся фон один раз, в контекст вне экрана, вытащить изображение из него, а затем создать UIColor с образцом рисунка и установить его как цвет фона. Затем изображение будет выложено для вас.

Вы начинаете контекст изображения с UIGraphicsBeginImageContextWithOptions(). Параметры включают размер вашего ожидаемого изображения - я предполагаю, что это ширина вашего scrollview и x пикселей высока, непрозрачность и масштаб. Отправьте 0 для шкалы для автоматической поддержки сетчатки.

Затем вы можете действовать так, как если бы вы были в методе drawRect, поэтому ваши функции выше можно назвать нормальными.

Затем извлечь изображение:

UIImage *background = UIGraphicsGetImageFromCurrentImageContext(); 

Конечным контекст изображения:

UIGraphicsEndImageContext(); 

Затем создать цвет:

UIColor *backgroundColor = [UIColor colorWithPatternImage:background]; 

и установить, что в качестве фона для вашего Scrollview , Набрал на телефоне, так что извиняюсь за ... все.

+0

Как кешировать что-то? И как мне закодировать третий вариант? – Andrew

+0

Я думаю, что третий вариант лучше, поэтому я обновляю ответ с некоторыми рекомендациями по этому вопросу, а не с кучей опций. – jrturton

+0

Отлично, спасибо :) – Andrew

Смежные вопросы