在iOS17上,YYText会报以下错误:
UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={0, 0}, scale=3.000000, bitmapInfo=0x2002. Use UIGraphicsImageRenderer to avoid this assert.
解决方法如下:
在YYTextAsyncLayer.m文件中,_displayAsync:(BOOL)async 方法中。
原代码:
UIGraphicsBeginImageContextWithOptions(self.bounds.size,self.opaque,self.contentsScale);
CGContextRef context =UIGraphicsGetCurrentContext();if(self.opaque){
CGSize size =self.bounds.size;
size.width *=self.contentsScale;
size.height *=self.contentsScale;CGContextSaveGState(context);{if(!self.backgroundColor ||CGColorGetAlpha(self.backgroundColor)<1){CGContextSetFillColorWithColor(context,[UIColor whiteColor].CGColor);CGContextAddRect(context,CGRectMake(0,0, size.width, size.height));CGContextFillPath(context);}if(self.backgroundColor){CGContextSetFillColorWithColor(context,self.backgroundColor);CGContextAddRect(context,CGRectMake(0,0, size.width, size.height));CGContextFillPath(context);}}CGContextRestoreGState(context);}
task.display(context,self.bounds.size,^{return NO;});
UIImage *image =UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();self.contents =(__bridge id)(image.CGImage);
修复后的代码:
UIGraphicsImageRendererFormat *format =[[UIGraphicsImageRendererFormat alloc] init];
format.opaque =self.opaque;
format.scale =self.contentsScale;
UIGraphicsImageRenderer *renderer =[[UIGraphicsImageRenderer alloc] initWithSize:self.bounds.size format:format];
UIImage *image =[renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext){
CGContextRef context = rendererContext.CGContext;if(self.opaque){
CGSize size =self.bounds.size;
size.width *=self.contentsScale;
size.height *=self.contentsScale;CGContextSaveGState(context);{if(!self.backgroundColor ||CGColorGetAlpha(self.backgroundColor)<1){CGContextSetFillColorWithColor(context,[UIColor whiteColor].CGColor);CGContextAddRect(context,CGRectMake(0,0, size.width, size.height));CGContextFillPath(context);}if(self.backgroundColor){CGContextSetFillColorWithColor(context,self.backgroundColor);CGContextAddRect(context,CGRectMake(0,0, size.width, size.height));CGContextFillPath(context);}}CGContextRestoreGState(context);}
task.display(context,self.bounds.size,^{return NO;});}];self.contents =(__bridge id)(image.CGImage);
版权归原作者 RookieJin 所有, 如有侵权,请联系我们删除。