iOS13适配记录

作者: wg刚 | 来源:发表于2019-09-26 13:15 被阅读0次

1、模态跳转方式:presentViewController

问题如下图:

解决:跳转前,添加入下一句代码即可

vc.modalPresentationStyle = UIModalPresentationFullScreen;

别添加错位置了,是即将跳转的页面添加,不是self

例如:

IndicationViewController *vc = [[IndicationViewController alloc] init];
vc.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:vc animated:YES completion:nil];

runtime优化presentViewController方式跳转:

1、把如下代码拷贝到项目之中即可全局解决,跳转使用之前样式
2、如果某个controller想使用新样式,则
vc.wg_setModalPresentationStyle = NO;

.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIViewController (WGPresent)

// 某个控制器想用系统默认,则设置NO
@property (nonatomic, assign) BOOL wg_setModalPresentationStyle;

@end

NS_ASSUME_NONNULL_END
.m
#import "UIViewController+WGPresent.h"
#import <objc/runtime.h>

@implementation UIViewController (WGPresent)

+(void)load {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        SEL oldSel = @selector(presentViewController:animated:completion:);
        SEL newSel = @selector(wg_presentViewController:animated:completion:);
        
        Method old = class_getInstanceMethod([self class], oldSel);
        Method new = class_getInstanceMethod([self class], newSel);
        if (class_addMethod([self class], oldSel, method_getImplementation(new), method_getTypeEncoding(new))) {
            
            class_replaceMethod([self class], newSel, method_getImplementation(old), method_getTypeEncoding(old));
        }else {
            
            method_exchangeImplementations(old, new);
        }
    });
}

- (void)wg_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    
    if (@available(iOS 13.0, *)) {
        
        if (viewControllerToPresent.wg_setModalPresentationStyle) {
            
            viewControllerToPresent.modalPresentationStyle = UIModalPresentationFullScreen;
        }
    }
    [self wg_presentViewController:viewControllerToPresent animated:flag completion:completion];
}

- (BOOL)wg_setModalPresentationStyle {
    
    NSNumber *obj = objc_getAssociatedObject(self, @selector(wg_setModalPresentationStyle));
    return obj ? [obj boolValue] : [self.class wg_GlobalSetModalPresentationStyle];
}

-(void)setWg_setModalPresentationStyle:(BOOL)wg_setModalPresentationStyle {
    
    objc_setAssociatedObject(self, @selector(wg_setModalPresentationStyle), @(wg_setModalPresentationStyle), OBJC_ASSOCIATION_ASSIGN);
}

//以后迭代版本,想全部用系统之前样式(排除UIImagePickerController,UIAlertController)
+ (BOOL)wg_GlobalSetModalPresentationStyle {
    
    if ([self isKindOfClass:[UIImagePickerController class]] || [self isKindOfClass:[UIAlertController class]]) {
        
        return NO;
    }
    return YES;
}

@end

2、全局关闭暗黑模式

1、在Info.plist 文件中,添加UIUserInterfaceStyle key 名字为 User Interface Style 值为String。
2、将UIUserInterfaceStyle key 的值设置为 Light

3、单个界面不遵循暗黑模式

UIViewController与UIView 都新增一个属性 overrideUserInterfaceStyle,将 overrideUserInterfaceStyle 设置为对应的模式,则强制限制该元素与其子元素以设置的模式进行展示,不跟随系统模式改变进行改变

4、通过 KVC来修改一些没有暴露出来的属性,崩溃

[self.importCertificateNumTextFiled setValue:kGrayColor forKeyPath:@"_placeholderLabel.textColor"];

修改为

if (@available(iOS 13.0, *)) {
    self.importCertificateNumTextFiled.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"请输入" attributes:@{NSForegroundColorAttributeName : kGrayColor}];
}else{
    [self.importCertificateNumTextFiled setValue:kGrayColor forKeyPath:@"_placeholderLabel.textColor"];
}

5、适配Dark Mode

6、UITabBar title选中颜色被还原,出现问题

在设置UITabBar的地方添加如下代码

 [[UITabBar appearance] setUnselectedItemTintColor: UIColor.grayColor];

例如我的代码:

- (UINavigationController *)viewController:(UIViewController *)vc title:(NSString *)title nomalImg:(NSString *)imgStr tag:(NSInteger)tag{
    
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:title image:[UIImage imageNamed:imgStr] tag:tag];
    item.selectedImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@",imgStr,@"s"]];
    [item setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:UIColor.redColor, NSForegroundColorAttributeName, nil] forState:UIControlStateSelected];
    [[UITabBar appearance] setUnselectedItemTintColor:UIColor.grayColor];
    
    vc.tabBarItem = item;
    return nav;
}

参考:
iOS13 暗黑模式(Dark Mode)适配之OC版
iOS 13 问题解决以及苹果登录,暗黑模式
iOS13 DarkMode适配(一)

相关文章

  • iOS13 适配问题 看这一篇就够了

    技术参考: apple login IOS13适配-详细 iOS 13 适配(持续更新中) iOS13适配 掘金 ...

  • iOS 13适配

    技术参考: apple login IOS13适配-详细 iOS 13 适配(持续更新中) iOS13适配 掘金 ...

  • iOS 13适配记录9.24

    自己项目中适配记录 1、PresentViewCotroller iOS13默认present方式为卡片形式,对于...

  • iOS13适配

    最新iOS13适配填坑记录如下: 1.私有API被封禁(KVC限制),禁止访问。 iOS13中通过KVC方式来获取...

  • iOS 关于iOS13那些事

    本文记录一些关于iOS 13的内容,欢迎指正和补充! 一、关于iOS13适配 1.关于一些私有属性的适配,iOS ...

  • iOS13适配记录

    1、模态跳转方式:presentViewController 问题如下图: 解决:跳转前,添加入下一句代码即可 别...

  • 暗黑模式开发

    iOS13暗黑模式适配(项目开发版) iOS 13 DarkMode 暗黑模式 IOS 暗黑模式适配---基础适配

  • iOS13适配更新总结

    前言: iOS13的API的变动和适配问题,我从新特性适配、API 适配、方法弃用、工程适配、SDK 适配、其他问...

  • iOS13适配研究

    iOS13今年秋季会发布,最近深入研究了下公司APP适配iOS13的注意点,适配如下。 1.由于Xcode10移除...

  • iOS13适配

    参考: iOS13 适配踩坑 - 持续更新 iOS 13 适配要点总结 iOS 13 适配要点总结 1、prese...

网友评论

    本文标题:iOS13适配记录

    本文链接:https://www.haomeiwen.com/subject/dwnguctx.html