2013-04-22 8 views
3

Я хочу добавить скругленные углы к UIImageView без использования QuartzCore, чтобы избежать проблем с производительностью в UIScrollView, так что я решил его так:Клип UIImage с UIBezierPath Асинхронный

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)]; 
    [path addClip]; 

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [[UIScreen mainScreen] scale]); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeClear); CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor); 
    CGContextAddPath(context,path.CGPath); 
    CGContextClip(context); 
    CGContextClearRect(context,CGRectMake(0,0,width,height)); 

    [_image drawInRect:rect]; 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

К сожалению, названный в DrawRect, это занимает немного времени обработки, которое вызывает задержку при прокрутке в UIScrollView. Поэтому я попытался обработать это в отдельном потоке с помощью dispatch_async. Это устранило отставание, и все работает плавно, как должно быть. Но теперь у меня другая проблема. Я получаю много недопустимых контекстных сообщений в отладчике, потому что GraphicsContext не всегда присутствует, когда поток запускает обработку изображения асинхронно. Есть ли способ обрабатывать закругленные углы в моем изображении без получения недопустимых контекстных сообщений? Обратите внимание, что я не хочу использовать функции cornerRadius или маски-функции QuarzCore.

ответ

4

Вы делаете больше работы, чем вам нужно. Сообщения «недопустимый контекст» вызваны вызовом [path addClip] перед вызовом UIGraphicsBeginImageContextWithOptions(). UIBezierPath пытается получить доступ к текущему графическому контексту потока, но вы еще не установили его.

Вот простой способ получить те же результаты. Обратите внимание, что вам вообще не нужно использовать CGContext.

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); 

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(self.cornerRadius, self.cornerRadius)]; 
[path addClip]; 

[_image drawInRect:rect]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+1

спасибо за совет, отлично работает;) – kohaXun

+0

Отличное решение, работайте как шарм. –

1

Я хочу добавить скругленные углы к UIImageView без использования QuartzCore избежать выполнения выдает

Один подход заключается в округлить углы изображения вместо углов UIImageView , Смотрите мой ответ здесь:

https://stackoverflow.com/a/8125604/341994

Мы начнем с любым UIImage и вокруг его углов, вовлекаюсь в подстриженном контекст. Это не требует «времени обработки» и не вызывает проблем с производительностью.

(Примечание: В табличном или другой очень быстрой прокрутке или анимации ситуации, может возникнуть проблемы производительности, вызванная прозрачность в скругленных углах Но это гораздо более общая проблема и имеет мало обойтись. как округление выполняется, это связано с тем, что мы должны постоянно составлять движущуюся фигуру на фоне. Если фон является сплошным цветом, и вы заранее знаете, что это будет, эффективнее сделать opaque изображение, где округлые угловые области имеют цвет фона.)

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