YYKit 在iOS 17 运行崩溃问题,触发 UIGraphicsBeginImageContext 断言

2024年5月23日 74点热度 0人点赞 0条评论

 

提示:Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410

Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410

 

问题原因

UIGraphicsBeginImageContext API 在 iOS17 已经被废弃了

 

解决方法

创建 Category 文件:新建文件 > Objective-C File

File:填写名称如Hook (实际文件名称YYAsyncLayer+Hook.h)

File Type:选择Category

Class:YYAsyncLayer (注意,YYKit为:YYAsyncLayer;YYText为:YYTextAsyncLayer)

 

创建 Category 文件

 

建成文件示例,以 YYAsyncLayer 为例:

// .h 文件

#import "YYAsyncLayer.h"

NS_ASSUME_NONNULL_BEGIN

@interface YYAsyncLayer (Hook)

@end

NS_ASSUME_NONNULL_END

 

 

//  .m 文件

#import "YYAsyncLayer+Hook.h"

@implementation YYAsyncLayer (Hook)
+ (void)load {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method a = class_getInstanceMethod(self, @selector(display));
        Method b = class_getInstanceMethod(self, @selector(swizzing_display));
        method_exchangeImplementations(a, b);

    });
}
- (void)swizzing_display{
    //通过变量名称获取类中的实例成员变量
    if (self.bounds.size.width <=0 || self.bounds.size.height <=0) {
        self.contents = nil;
        return;
    } else {
        [self swizzing_display];
    }
}
@end

注意⚠️:load 为类方法

 

重新运行,问题解决(最好是 Clean 项目,以及重启模拟器)。

 

 

如果Swift或者跟踪YYKit解决进度,请查看 https://github.com/ibireme/YYText/issues/984

 

帮助教程

提供最新的帮助教程,方便使用。

文章评论