美文网首页
iOS13:部分适配

iOS13:部分适配

作者: 春暖花已开 | 来源:发表于2019-08-15 14:36 被阅读0次

iOS13之后处理方法稍有变更,先记录一下,希望能对遇到同样问题的coder有所帮助。

1、去除tabBar上的黑线

if (@available(iOS 13.0, *)) {
    UITabBarAppearance *appearance = [self.tabBar.standardAppearance copy];
    appearance.backgroundImage = [UIImage imageNamed:@"tabbar_bg"];
    appearance.shadowImage = [UIImage new];
    appearance.shadowColor = [UIColor clearColor];
    self.tabBar.standardAppearance = appearance;
} else {
    [self.tabBar setBackgroundImage:[UIImage imageNamed:@"tabbar_bg"]];
    [self.tabBar setShadowImage:[UIImage new]];
}

如果你只是简单的想去除上面的黑条,而又没有控件超出tabbar,可以直接用下面的方法:

self.tabBar.clipsToBounds = YES;

2、自定义各个tabBarItem:iOS13后不再支持对各个Item样式的单独定制

// TabBarViewController
- (void)viewDidLoad {
    UITabBarAppearance *appearance = self.tabBar.standardAppearance;
    [appearance.stackedLayoutAppearance.normal setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor colorWithHexString:@"AEBBC2"],NSFontAttributeName:[UIFont systemFontOfSize:10.0f]}];
    self.tabBar.standardAppearance = appearance;
}

// 赋值各个Item选中时的个性化设置
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

    if (@available(iOS 13, *)) {
        UITabBarAppearance *appearance = self.tabBar.standardAppearance;
        [appearance.stackedLayoutAppearance.selected setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor colorWithHexString:self.titleColors[tabBarController.selectedIndex]],NSFontAttributeName:[UIFont systemFontOfSize:10.0f]}];
        self.tabBar.standardAppearance = appearance;
    }
}
效果图

3、禁止跟随系统的暗黑模式

<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>

appDelegate里,

- (void)configLightMode {
    if (@available(iOS 13.0, *)) {
        self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    }
}

指定页面的statusBarStyle变换,请参考iOS:状态栏


4、TabBar透明

if (@available(iOS 13.0, *)) {
    UITabBarAppearance *appearance = [self.tabBar.standardAppearance copy];
    appearance.backgroundImage = [UIImage new];
    appearance.shadowImage = [UIImage new];
    appearance.shadowColor = [UIColor clearColor];
    appearance.backgroundEffect = nil;
    self.tabBar.standardAppearance = appearance;
} else {
    [self.tabBar setBarTintColor:[UIColor clearColor]];
    [self.tabBar setBackgroundImage:[UIImage new]];
}

5、适配暗黑模式

a. 颜色适配
// MZInterfaceStyleService.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MZInterfaceStyleService : NSObject

/// 手动控制适配模式(全局的) 默认为开启暗黑模式
@property (nonatomic, assign, class) BOOL openDarkMode;
@property (nonatomic, assign, class, readonly, getter=isCurrentModeDark) BOOL currentModeDark;

/// label文字颜色  如果有多种文字颜色可以设置多个 eg: labelTextColor
@property (nonatomic, strong, class, readonly) UIColor *labelTextColor;
/// button文字颜色  如果有多种文字颜色可以设置多个 eg:  buttonTextColor
@property (nonatomic, strong, class, readonly) UIColor *buttonTextColor;
/// textField文字颜色  如果有多种文字颜色可以设置多个 eg:  fieldTextColor
@property (nonatomic, strong, class, readonly) UIColor *fieldTextColor;

/// label背景颜色  如果有多种文字颜色可以设置多个 eg: labelBgColor
@property (nonatomic, strong, class, readonly) UIColor *labelBgColor;
/// button背景颜色  如果有多种文字颜色可以设置多个 eg: buttonBgColor
@property (nonatomic, strong, class, readonly) UIColor *buttonBgColor;
/// view背景颜色  如果有多种文字颜色可以设置多个 eg: viewBgColor
@property (nonatomic, strong, class, readonly) UIColor *viewBgColor;

@end

NS_ASSUME_NONNULL_END


// MZInterfaceStyleService.m
#import "MZInterfaceStyleService.h"

static BOOL _isOpenDarkMode = YES;

@implementation MZInterfaceStyleService

/// 以下的颜色,都需要根据自己项目的实际需要进行定制
+ (UIColor *)labelTextColor {
    return [self getCurrentModeColorWithDark:UIColor.whiteColor light:UIColor.redColor];
}

+ (UIColor *)buttonTextColor {
    return [self getCurrentModeColorWithDark:UIColor.whiteColor light:UIColor.redColor];
}

+ (UIColor *)fieldTextColor {
    return [self getCurrentModeColorWithDark:UIColor.whiteColor light:UIColor.redColor];
}

+ (UIColor *)labelBgColor {
    return [self getCurrentModeColorWithDark:UIColor.whiteColor light:UIColor.redColor];
}

+ (UIColor *)buttonBgColor {
    return [self getCurrentModeColorWithDark:UIColor.whiteColor light:UIColor.redColor];
}

+ (UIColor *)viewBgColor {
    return [self getCurrentModeColorWithDark:UIColor.whiteColor light:UIColor.redColor];
}


// 根据当前模式,获得动态颜色
+ (UIColor *)getCurrentModeColorWithDark:(UIColor *)dark light:(UIColor *)light {
    
    // 如果不需要打开暗黑模式,直接返回light
    if (!MZInterfaceStyleService.openDarkMode) {
        return light;
    }
    
    if (@available(iOS 13.0, *)) {
        
        return [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
            return traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ? dark : light;
        }];
    }
    return light;
}


#pragma mark - 是否启用暗黑模式

+ (BOOL)openDarkMode {
    return _isOpenDarkMode;
}

+ (void)setOpenDarkMode:(BOOL)openDarkMode {
    _isOpenDarkMode = openDarkMode;
}

+ (BOOL)isCurrentModeDark {
    if (!_isOpenDarkMode) {
        return NO;
    }
    
    if (@available(iOS 13.0, *)) {
        return UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark;
    }
    
    return NO;
}

@end

使用

[self.clickBtn setTitleColor:MZInterfaceStyleService.buttonTextColor forState:UIControlStateNormal];
b. 图片适配

在 Images.xcassets 中设置颜色和图片是向下兼容的,iOS 13 以下的系统会默认取 Any 状态下的设定,iOS 13 会根据系统模式取 AnyLightDark 下的设定。

补充
在 iOS 13中,UIView、UIViewController 、UIWindow 有了一个 overrideUserInterfaceStyle 的新属性,可以覆盖系统的模式。单个页面或视图关闭暗黑模式,设置 overrideUserInterfaceStyle 为对应的模式,强制限制该视图与其子视图以设置的模式进行展示,不跟随系统模式改变进行改变。
如:

self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

设置此属性会影响当前 view/viewController/window 以及它下面的任何内容。
如果你希望一个子视图监听系统的模式,请将 overrideUserInterfaceStyle 属性设置为UIUserInterfaceStyleUnspecified

该部分图片适配参考:
iOS 13 DarkMode 暗黑模式

相关文章

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

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

  • iOS 13适配

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

  • iOS13:部分适配

    iOS13之后处理方法稍有变更,先记录一下,希望能对遇到同样问题的coder有所帮助。 1、去除tabBar上的黑...

  • 2019-09-29 ios13适配

    ios13禁用了大部分的kvc,所以如UISearchBar的自定义外观也需要适配 UISegmentedCont...

  • 暗黑模式开发

    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适配(更新中)

    对于iOS13适配汇总以及遇到的问题注意:以下适配内容,必须适配的会以"必须"标出 1. Dark Model(必...

  • 关于WRNavigationBar iOS12、iOS13导航栏

    集成WRNavigationBar 适配iOS12 iOS13导航栏问题 在修复iOS13下在iPhone11机型...

网友评论

      本文标题:iOS13:部分适配

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