iOS 13.4 & Xcode 11.4 采坑小记(重写系统get)
发布日期:2022-04-05 00:52:15
浏览次数:3
分类:博客文章
本文共 3056 字,大约阅读时间需要 10 分钟。
最近更新了新系统,发现Modal样式设置的UIModalPresentationFullScreen失效了。
相信大家在适配iOS13 系统的时候,为了适配Modal默认样式发生变化( iOS13之前默认为UIModalPresentationFullScreen 13之后变为UIModalPresentationAutomatic)很多人是通过分类方法实现的。
即:为UIViewController扩展该方法(本质是重写modalPresentationStyle属性的get方法),这样所有地方就直接生效了,不用一处一处修改,当然私有pod库中的还是要自己修改。
/* Defines the presentation style that will be used for this view controller when it is presented modally. Set this property on the view controller to be presented, not the presenter. If this property has been set to UIModalPresentationAutomatic, reading it will always return a concrete presentation style. By default UIViewController resolves UIModalPresentationAutomatic to UIModalPresentationPageSheet, but system-provided subclasses may resolve UIModalPresentationAutomatic to other concrete presentation styles. Participation in the resolution of UIModalPresentationAutomatic is reserved for system-provided view controllers. Defaults to UIModalPresentationAutomatic on iOS starting in iOS 13.0, and UIModalPresentationFullScreen on previous versions. Defaults to UIModalPresentationFullScreen on all other platforms. */@property(nonatomic,assign) UIModalPresentationStyle modalPresentationStyle API_AVAILABLE(ios(3.2));
// 适配iOS13- (UIModalPresentationStyle)modalPresentationStyle { // 适配iOS13系统下 RN弹窗内容被遮挡 if ([self isKindOfClass:NSClassFromString(@"RCTModalHostViewController")]) { return UIModalPresentationOverCurrentContext; } else { return UIModalPresentationFullScreen; }}
然后问题来了,分类中的 - (UIModalPresentationStyle)modalPresentationStyle 这个方法在Xcode 11.4 & iOS 13.4 环境下 不再执行了。
至此找到问题根本原因是 Xcode 11.4 & iOS 13.4 环境下 分类重写系统级属性的get方法会失效。正常的系统级方法(如:- (void)viewWillAppear:(BOOL)animated;重写)还是会调用。
解决办法:(目前最高效办法是1,若后续苹果不修复此BUG,可用方法2解决)
1、使用低版本Xcode打包
2、使用运行时方法替换(系统还是会调用这个方法,只不过不再调用我们重写的get方法,所以替换方法实现)
+ (void)swizzleInstanceSelector:(SEL)originalSelector withSelector:(SEL)swizzledSelector{ Class class = [self class]; Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (success) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); }}+ (void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self swizzleInstanceSelector:@selector(modalPresentationStyle) withSelector:@selector(uiviewController_modalPresentationStyle)]; });}- (UIModalPresentationStyle)uiviewController_modalPresentationStyle{ // 适配iOS13系统下 RN弹窗内容被遮挡 if ([self isKindOfClass:NSClassFromString(@"RCTModalHostViewController")]) { return UIModalPresentationOverCurrentContext; } else { return UIModalPresentationFullScreen; }}
拓展:
系统属性的get方法重写可能都会受到影响
转载地址:https://www.cnblogs.com/lijianyi/p/12607377.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月04日 23时01分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vue的一些基础知识点
2019-04-26
webpack错误记录(不定期更新)
2019-04-26
Poj百练 2692:假币问题 (分类:模拟)
2019-04-26
SpringBoot实现一个文件上传服务
2019-04-26
前后分但文件上传与多文件上传,前端实现
2019-04-26
Poj百练 2711:合唱队形 (分类:动态规划)
2019-04-26
SpringBoot自定义banner
2019-04-26
JWT(JSON Web Token)认证小结
2019-04-26
Poj百练 2746:约瑟夫问题 (分类:模拟)
2019-04-26
git知识点梳理
2019-04-26
git中tag标签的用法
2019-04-26
VTK:文字来源TextOrigin
2019-04-26
VTK:XYPlot图
2019-04-26
VTK:检查模块CheckForModule
2019-04-26
VTK:复合数据之CompositePolyDataMapper
2019-04-26
VTK:复合数据之Generate2DAMRDataSetWithPulse
2019-04-26
VTK:复合数据之Generate3DAMRDataSetWithPulse
2019-04-26
VTK:复合数据之MultiBlockDataSet
2019-04-26
VTK:复合数据之OverlappingAMR
2019-04-26