Рисование линейного градиента в прямоугольнике работает на iOS 5.x, но не на 4.x - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть некоторый код, который я использую, чтобы заполнить представление линейным градиентом, я преобразовал это в вспомогательный метод. Это прекрасно работает на iOS 5.x, но когда я попытался запустить на 4.3.5, я ничего не получил. Я проверил все CG-вызовы, и все они поддерживаются на 4.0 или более старых версиях, это выглядит так просто, что я не могу понять, почему это не работает на 4.x.

- (void)drawRect:(CGRect)rect {

CGContextRef context = UIGraphicsGetCurrentContext();    
CGColorRef startColor = [UIColor lightGrayColor].CGColor;
CGColorRef endColor = [UIColor blackColor].CGColor;    
CGRect paperRect = self.frame;
[GraphicsHelpers drawLinearGradientWithContext:context 
                                        inRect:paperRect 
                                    startColor:startColor 
                                      endColor:endColor];
}

Вот этот метод

+ (void)drawLinearGradientWithContext:(CGContextRef)context inRect:(CGRect)rect startColor:(CGColorRef)startColor endColor:(CGColorRef)endColor {

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = { 0.0, 1.0 };

NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];

CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, 
                                                    (__bridge CFArrayRef) colors, locations);

CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));

CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextClip(context);

CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);

}

Я нашел большую часть этого кода здесь и работал отлично, пока не начал тестирование на старых версиях ОС, так как я близок к выпуску.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

У меня была та же проблема, решена обошла ее, создав градиент, используя

CGGradientCreateWithColorComponents

.. вместо CGGradientCreateWithColors.

Итак, для градиентаот светло-серого до черного вам нужно сделать следующее:

CGFloat colors[8] = {
    0.9f, 0.9f, 0.9f, 1.0f, // light gray
    0.0f, 0.0f, 0.0f, 1.0f  // black
};

CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, 2);

Это работает как в iOS 4, так и в 5.

1 голос
/ 24 марта 2012

Мне пришлось столкнуться с той же проблемой, что и попытка заполнить вид градиентом.Наконец, я обнаружил, что определенный UIColor (redColor, whiteColor и т. Д.) Несовместим с CGColors.Использование ([UIColor whiteColor] .CGColor) служит для CGColor, который не является несовместимым или не поддерживается в iOS 4.3.По этой причине я попытался использовать [UIColor colorWithRed: 1,0 зеленый: 1,0 синий: 1,0 альфа: 1,0] .CGColor.Это может быть преобразовано в пространство CGColor, и, наконец, у меня был градиент на мой взгляд также с ios 4.3 и ios 5.x

0 голосов
/ 06 декабря 2011

Если вы используете поддерживаемый API и получаете разные результаты от одной версии ОС к другой, отправьте отчет об ошибке.

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