精华内容
下载资源
问答
  • iOS 13 DarkMode 暗黑模式

    千次阅读 2019-10-10 10:22:15
    iOS 13终于引来了暗黑模式。 每当新特性的到来,iOS开发者们既紧张又有点小兴奋,怀揣着被虐的心态,让我们来看看暗黑模式到底是个啥。 虽然这是一个设计驱动的需求,但是本着一颗虔诚(暴躁)的心,我们还是要一...

    iOS 13终于引来了暗黑模式。

    每当新特性的到来,iOS开发者们既紧张又有点小兴奋,怀揣着被虐的心态,让我们来看看暗黑模式到底是个啥。

    虽然这是一个设计驱动的需求,但是本着一颗虔诚(暴躁)的心,我们还是要一步步来,“工欲善其事、必先利其器”,搞清楚应该怎么做。

    下载 Xcode11,跑起来你的项目。模拟器启动后,在“设置”-“开发者”中打开“Dark Appearance”后,你的项目就自动运行在暗黑模式了。

    有些界面会很奇怪,这很正常,可以从一个界面入手,一步步优化它。

    UITraitCollection

    先来了解下 UITraitCollection。

    在 iOS 13 中,我们可以通过 UITraitCollection 来判断当前系统的模式。UIView 和 UIViewController 、UIScreen、UIWindow 都已经遵从了UITraitEnvironment 这个协议,因此这些类都拥有一个叫做 traitCollection 的属性,在这些类中,我们可以这样去判断当前 App 的颜色模式:

    BOOL isDark = (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark);

    另外,我们还可以通过 UITraitCollection.current 这个属性来获取当前 App 的颜色模式。但是并不是所有的时候获取的都是正确的,只有在下面这些方法中,才可以放心的使用这个属性:

    UIView

    UIViewController

    UIPresentationController

    draw()

     

     

    layoutSubview()

    viewWillLayoutSubviews() viewDidLayoutSubviews()

    containerViewWillLayoutSubviews() containerViewDidLayoutSubviews()

    traitCollectionDidChange() tintColorDidChange()

    traitCollectionDidChange()

    traitCollectionDidChange()

    还没适配完又不想给用户看,可以先暂时全局关闭暗黑模式:

    在 Info.plist 文件中,添加 key 为 User Interface Style,类型为 String,value 设置为 Light 即可。

     

     

    infoplist.png

    在 iOS 13中,UIView、UIViewController 、UIWindow 有了一个 overrideUserInterfaceStyle 的新属性,可以覆盖系统的模式。

    单个页面或视图关闭暗黑模式,设置 overrideUserInterfaceStyle 为对应的模式,强制限制该视图与其子视图以设置的模式进行展示,不跟随系统模式改变进行改变。

    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

    设置此属性会影响当前view/viewController/window 以及它下面的任何内容。

    如果你希望一个子视图监听系统的模式,请将 overrideUserInterfaceStyle 属性设置为.unspecified。

    颜色

    系统颜色

    在 iOS 13中,苹果引入了全新系统颜色,系统颜色是动态的,会根据当前系统是默认模式还是暗黑模式动态调整颜色。

    苹果还提供了一组动态的灰度颜色。

     

    systemcolor.png

    语义化颜色

    苹果提供了一套根据颜色使用目的而约定颜色命名的语义化颜色。语义化颜色也是动态颜色。

    例如系统背景色(SystemBackground)、分割线颜色(SeparatorColor)等等,使用语义化颜色确保你的 App 具有和系统应用高度类似的配色风格。通过使用语义化颜色,可以让你的 App 更加贴近原生体验,这是官方希望达到的最佳体验。

     

    elementcolor.png

    以上两种动态颜色,是 iOS 13 才支持的新特性,并且颜色有限,大概率不能满足 App 的使用,继续往下看。

    自定义颜色:通过 Assets 配置

    在 iOS 11和 Xcode 9 中,我们可以在 Images.xcassets 中添加颜色。

    现在我们可以为颜色再配置一个用于暗黑模式的对应的颜色。

     

    assets.png

    通过代码自定义颜色

    + (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider;

    - (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider;

    iOS 13 提供了的新方法,可以在 block 中判断 traitCollection.userInterfaceStyle,根据系统模式设置返回的颜色。

    +(UIColor *)generateDynamicColor:(UIColor *)lightColor darkColor:(UIColor *)darkColor{

        if (@available(iOS 13.0, *)) {

            UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {

                if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight) {

                    return lightColor;

                }else {

                    return darkColor;

                }

            }];

            return dyColor;

        }else{

            return lightColor;

        }

    }

    图片

    SF Symbols

    苹果在 WWDC19 上引入了 SF Symbols 。SF Symbols是一个巨大的矢量图标库(超过1500),可供开发人员在自己的 App 中使用。

    更多可以查看关于 SF Symbols 的 Session 206-Introducing SF Symbols,下载.dmg可以查看全部图标。苹果在自己的应用中使用,也推荐开发者使用。

    if (@available(iOS 13.0, *)) {

            _iconIV.image = [UIImage systemImageNamed:@"plus.circle"];

    }

     

    不想用 SF Symbols 的话,还有一种方式就是和自定义颜色相同的方法,在 Images.xcassets 中配置不同模式下的图片。

     

    assets_image.png

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

    模糊效果

    在 iOS 中,我们创建模糊效果的 UIVisualEffectView 的代码也会有明确表面明暗的情况。

    在 iOS 13 中,我们需要让这些模糊效果随着系统模式的切换而切换。UIKit 提供了新的模糊样式且是动态的,会随着系统模式的改版而自动匹配。

    利用 UIVisualEffectView 来创建一些类似模糊的效果时,不要设置类似 UIBlurEffectStyleExtraLight 这样带有明确颜色的效果,而是设置 UIKit 中新提供的动态样式的效果,比如 UIBlurEffectStyleSystemThinMaterialLight 或 UIBlurEffectStyleSystemThinMaterialDark。

    UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleSystemMaterial];

    UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];

     

     

    启动图

    如果我们的 App 使用了 LaunchImage 作为启动屏,那么就应该考虑把 LaunchImage 换成 LaunchScreen.storyboard 了,因为在 Xcode 11 中 LaunchImage 并不能像普通的图片那样针对深色模式设置另外的一张图片。

    富文本

    给 Attributed String 加上一个 foregroundColor 属性,设置动态的颜色即可。

    [attr addAttribute:NSForegroundColorAttributeName value:[UIColor labelColor] range:NSMakeRange(10, 20)];

     

    layer

    关于 layer 的话,可以通过调用 view. traitcollection 从 view 中获得当前的 UITraitCollection。

    UIColor *resolvedColor = [[UIColor labelColor] resolvedColorWithTraitCollection:self.view.traitCollection];

    label.layer.borderColor = resolvedColor.CGColor;

     

     

    如果我们需要解析多种颜色,UITraitCollection 有一个方便的 performAsCurrent() 方法:

    [self.view.traitCollection performAsCurrentTraitCollection:^{

        for (UIColor *color in self.colorsArr) {

            // 批量拿到 color.CGColor

        }

    }];

     

    调试 dark mode

    storyboards 和 xib 文件,现在可以切换界面之间的样式是默认还是暗黑了。

    在模拟器上,也可以直接切换暗黑模式进行调试了。

     

    debug.JPG

    一些新变更

    UIActivityIndicatorView 的 style 变更了。

    iOS 13前 的 UIActivityIndicatorViewStyle:

    typedef NS_ENUM(NSInteger, UIActivityIndicatorViewStyle) {

        UIActivityIndicatorViewStyleWhiteLarge,

        UIActivityIndicatorViewStyleWhite,

        UIActivityIndicatorViewStyleGray,

    };

     

    iOS 13后,由于暗黑模式,上述三个属性都被废弃,建议使用如下 style:

    typedef NS_ENUM(NSInteger, UIActivityIndicatorViewStyle) {

        UIActivityIndicatorViewStyleMedium,

        UIActivityIndicatorViewStyleLarge,

        UIActivityIndicatorViewStyleWhiteLarge API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleLarge",

        UIActivityIndicatorViewStyleWhite API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleMedium",

        UIActivityIndicatorViewStyleGray API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleMedium",

    };

    Status Bar 的 style 变更了。

    在 iOS 13 之前,状态栏的样式的枚举值也带有着明显的颜色倾向,UIStatusBarStyleDefault、UIStatusBarStyleLightContent。

    现在,状态栏的 default 样式会根据当前的模式展示不同的颜色,而原有的 lightContent 样式则新增一个 darkContent 的样式与之对应。

    typedef NS_ENUM(NSInteger, UIStatusBarStyle) {

        UIStatusBarStyleDefault      = 0, // Automatically chooses light or dark content based on the user interface style

        UIStatusBarStyleLightContent = 1, // Light content, for use on dark backgrounds

        UIStatusBarStyleDarkContent  = 3, // Dark content, for use on light backgrounds

    };

     

     

    参考资料:

    How To Adopt Dark Mode In Your iOS App

    Backwards compatibility for iOS 13 system colors

    写给设计师的指南:iOS 13 Dark Mode 深度解析

    作者简介

    就职于甜橙金融(翼支付)信息技术部,负责 iOS 客户端开发。

    展开全文
  • 相较于iOS13,iOS14并没有出现大刀阔斧的变化,但也升级了众多小功能,还添加了不少新功能,包括视频画中画,系统翻译,还有个性化的桌面小组件等。为了快人一步体验新功能,即使正式版还未发布,迫不及待的果粉们...

    六月末,WWDC2020年全球开发者大会正式启动,隆重推出了新系统iOS 14。相较于iOS13,iOS14并没有出现大刀阔斧的变化,但也升级了众多小功能,还添加了不少新功能,包括视频画中画,系统翻译器,还有个性化的桌面小组件等。

    为了快人一步体验新功能,即使正式版还未发布,迫不及待的果粉们纷纷下载iOS14的系统测试文件,安装到了iOS14的测试版。然而,体验完了新鲜功能,问题就来了。手机耗电快,APP应用常闪退,还有微信等聊天软件,聊天记录不能复制粘贴,图片无法发送的问题让安装了测试版的果粉们头疼不已。

    升级容易降级难,iPhone也未给果粉提供降级的方法。那么,如何才能将iPhone安全地从iOS14降回iOS13.5呢?本文小编将为小伙伴们详细介绍两种降级方法。

    849f0252e443a5ca9ab3321e9a60f523.png

    第一步:备份手机数据。

    无论是iPhone升级降级,还是出现系统问题需要刷机,这些过程都将造成手机原有数据的丢失。因此,请各位果粉谨记所有操作第一步:备份,备份,备份!

    首先,打开iTunes,通过USB数据线连接iPhone和电脑。

    bff707b876e8d9bea88effe577ce616a.png

    然后,选择设备,转到摘要,选择备份到本电脑。

    959cf14c62141c613697a46085972e93.png

    第二步:iPhone降级

    方案一:通过iTunes恢复手机以完成降级

    1. 在相关网站上下载iOS13的系统版本固件(按照您手机的型号下载对应的可支持下载的版本固件),保存到本地。

    2. 打开iTunes,连接iPhone。

    e1f4a767947049397973e0701d81d1a8.png

    3. 按住Shift键后,单击检查更新,选中桌面的iOS固件。

    213d03fec52ba1a50afe8ad07b227553.png

    4. 点击更新,iPhone开始降级,等待手机重启。

    578a1b78cb6bf32e791f208e1f133876.png

    方案二:通过牛学长苹果手机修复工具降级到iOS13.5.1

    牛学长苹果手机修复工具是一款专业的iPhone系统问题修复工具,拥有在10分钟左右的时间完成iPhone降级的强大功能。此外,如果用户在通过其他方式尝试降级iphone时遇到的卡在白苹果标志或者卡在恢复模式,也可以通过牛学长苹果手机修复工具修复系统故障。以下为使iPhone从iOS14降回iOS13.5.1的详细步骤。

    首先,打开牛学长苹果手机修复工具,同样使用USB数据线连接iPhone与电脑。

    c4e96f958b53869e0f1e64c4e2c0d7a6.png

    然后,选择修复系统功能,转入深度修复。

    dc6f814169cc83fb24ff3c8ac71095b7.png

    接着,下载iOS13.5.1系统固件。

    cc4a60bee592e927928c48285548a13d.png

    最后点击开始修复,手机在降级后将自动重启,降级完成。

    注:

    1. 两种降级方案都需先关闭“查找我的iPhone”。

    2. 在手机降级的过程中,最好使用苹果手机原装数据线连接手机与电脑,并且始终保持良好的网络环境。

    第三步:恢复手机备份

    降级完成后,手机自动重启,此时手机内原有数据已被清空,我们需要再次连接iTunes恢复之前的手机备份。

    打开备份在电脑中的位置,找到info.plist文件,以文本文件的方式打开,修改文件中的ios版本为ios13,然后保存文件。

    245d05e50abec986f5c42ce91e7f4158.png

    2185e3035b10c41d19f29088e7df2f66.png
    搜索Product version, 将14改为13

    注:因为之前的备份文件为iOS14系统,所以这里需要我们手动改为iOS13.

    回到iTunes,单机恢复备份,选择我们修改过的备份后点击开始。稍等片刻,备份完成。

    bb4700831b70f380fbbd9fa41f7723bf.png

    总结:

    1. iOS正式版还未发布,果粉们千万不要用主力机去升级测试版, 变砖风险太大。

    2. 升降级前一定记得备份!备份!备份!最好是iTunes备份,因为iCloud只有5G的免费空间,肯定是不够的。

    3. 由于iOS14系统问题,通过iTunes降级大概率会出现降级失败,手机陷入恢复模式。建议首选通过牛学长苹果手机修复工具完成iPhone降级。

    手机有问题,就找牛学长!风里雨里,牛学长都等你~

    (图文源自http://www.tenorshare.cn/ios-fix/ios14-downgrade.html,已获作者授权)

    展开全文
  • 文件appDelegate是系统帮我们创建的,但是在ios13后模式就更改了 变为了SceneDelegate,如果需要ios9-ios13全适配, 那么代码要在SceneDelegate和appDelegate写入. 他们的大意几乎是相同的,不同view窗口的加载,关闭,之...

    前文

    应用程序启动过程
    文件appDelegate是系统帮我们创建的,但是在ios13后模式就更改了
    变为了SceneDelegate,如果需要ios9-ios13全适配,
    那么代码要在SceneDelegate和appDelegate写入.
    他们的大意几乎是相同的,不同view窗口的加载,关闭,之类的…

    main.m文件中已经把appDelegate这个类,作为了代理了,实现里面相应的方法就可以了
    值得再次强调的是 ios13中,并不会走appDelegate这个类之前的ios13以下的,
    只会走SceneDelegate这个类 设置程序最低兼容ios版本,看警告提示就可以知道了
    最后加载配置文件中指定的main.storyboard改成自己的就可以了加载自定义的或是程序的

    正文

    ios13以下:

    • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
      程序加载完毕的时候会调用此方法

    -(void)applicatioinDidBecomeActive
    应用变为活跃状态 -(应用开始活跃了)
    -(void)applicationWIllResignActive
    程序即将不活跃 -(点home 从[活跃]变为[不活跃]) -(来了一个电话)
    -(void)applicationDidEnterBackground
    程序进入后台 -(点home 从[不活跃]到[后台] )
    -(void)applicationWillEnterForeground
    程序即将进入前台 -(点了home 选中此窗口之间的加载过程)
    -(void)applicationWIllTerminate
    应用即将被销毁 -(应用即将被关闭了)
    -(void)applicationDidReceiveMemoryWarning
    应用接收到内存警告

    应用程序销毁有两种情况,如果是home之后拖走是可以正常执行方法的
    如果进入了后台 过了一会 是无法执行的
    如果要保存用户数据 要在进入后台的时候保存

    通过代码的方式加载自定义的控制器

    首先删除系统提供的
    viewCOntroller.h/.m/main.storyboard
    删除info.plist的main为空
    在appDelegate.h声明(如果是ios13的话)
    @property (strong, nonatomic) UIWindow * window;
    self.windows = [UIWindwos alloc]initWithFrame:[[UiScreen mainScreen].bounds];
    //设置这个窗口的大小
    self.windwos.rootViewController = 创建一个继承uiviewcontroller的类
    //设置这个窗口的控制器
    self.window makeKeyAndVisible
    //设置这个窗口作为程序的主窗口 并可见

    控制器的view懒加载

    重写继承了uiviewcontroller的类方法为
    -(void)loadView; //必须要super viewDidLoad

    史诗级重点UINavigationController

    多控制管理里面的一种:
    导航控制器UINavigationController
    将windows.rootViewController设置为nav 这样可以有多个窗口之间的切换
    毕竟nav里面可以包括许多的UIviewcontroller
    初始化:
    UINavigationController *nav = [UINavigationController alloc ]init
    initWithRootViewController:xxxx
    通过有参构造设置nav的根控制器
    nav pushViewController:xxx animated:YES
    将xxx控制器放入栈中
    popToRootViewControllerAnimated:
    返回根控制器
    popViewControllerAnimated
    返回上个控制器
    .viewControllers获得导航控制器的栈内的所有控制器 数组
    popToViewController (参1:xxx控制器)
    返回到指定的控制器
    self.navigationController 获得当前的导航控制器
    至于导航控制器栈 我就不写了

    通过storyboard使用控制器

    在控件盒里面找到UINavigationController
    通过拖线选择根控制器
    拖动按钮可选择push的控制器 show
    返回就必须要通过代码去实现

    设置UiNavigationController的内容

    这里是NavigationItem
    通过代码:
    在viewDidLoad加载完毕后 设置控制器导航栏的内容
    self.navigationItem.title = @“xxx控制器” 设置控制器标题
    self.navigationItem.titleView = uiview 设置为uibiew类型的标题
    self.navigationItem.rightitemBarButtonItem/s = UIbarbuttonitem 设置右边的
    self.navigationItem.backBarBUttonItem.title= UIbarbuttonitem 设置返回按钮
    如果设置了左边的按钮,那么返回按钮就会消失.

    在storyboard上面设置
    直接在navigationitem里面拖动uibarbuttonitem就可以了
    如果不是根控制器,需要手动放入一个navigationitem控件

    生命周期

    • (void)viewDidLoad {
      [super viewDidLoad];
      NSLog(@"%@—>界面加载完成", [self class]);}
    • (void)viewWillAppear:(BOOL)animated {
      NSLog(@"%@ —>界面即将显示", [self class]);}
    • (void)viewDidAppear:(BOOL)animated {
      NSLog(@"%@ —> 界面已经显示出来",[self class]);}
    • (void)viewWillDisappear:(BOOL)animated {
      NSLog(@"%@ —> 界面即将消失", [self class]);}
    • (void)viewDidDisappear:(BOOL)animated {
      NSLog(@"%@ —> 界面已经消失", [self class]);}

    导航之前的传值segue

    UIStoryBoardSegue
    identifier 标记
    sourceVIewController 源控制器
    destinationViewController 目标控制器
    重写prepareForSegue 会有 UIStoryBoardSegue的segue属性
    得到这个uiview,在里面添加需要的值.即可
    必须是storyboard拖线才会执行

    补充
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.windowScene = (UIWindowScene*)scene;
    如果在ios13的SceneDelegate中写 需要额外加.windowScene = (UIWindowScene*)scene;

    展开全文
  • iOS开发 黑暗模式

    2020-03-31 11:17:38
    iOS 13终于引来了暗黑模式。 每当新特性的到来,iOS开发者们既紧张又有点小兴奋,怀揣着被虐的心态,让我们来看看暗黑模式到底是个啥。 虽然这是一个设计驱动的需求,但是本着一颗虔诚(暴躁)的心,我们还是要一...

    iOS 13终于引来了暗黑模式。

    每当新特性的到来,iOS开发者们既紧张又有点小兴奋,怀揣着被虐的心态,让我们来看看暗黑模式到底是个啥。

    虽然这是一个设计驱动的需求,但是本着一颗虔诚(暴躁)的心,我们还是要一步步来,“工欲善其事、必先利其器”,搞清楚应该怎么做。

    下载 Xcode11,跑起来你的项目。模拟器启动后,在“设置”-“开发者”中打开“Dark Appearance”后,你的项目就自动运行在暗黑模式了。

    有些界面会很奇怪,这很正常,可以从一个界面入手,一步步优化它。

    UITraitCollection

    先来了解下 UITraitCollection。

    在 iOS 13 中,我们可以通过 UITraitCollection 来判断当前系统的模式。UIView 和 UIViewController 、UIScreen、UIWindow 都已经遵从了UITraitEnvironment 这个协议,因此这些类都拥有一个叫做 traitCollection 的属性,在这些类中,我们可以这样去判断当前 App 的颜色模式:

     

    BOOL isDark = (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark);
    

    另外,我们还可以通过 UITraitCollection.current 这个属性来获取当前 App 的颜色模式。但是并不是所有的时候获取的都是正确的,只有在下面这些方法中,才可以放心的使用这个属性:

    UIView UIViewController UIPresentationController
    draw()    
    layoutSubview() viewWillLayoutSubviews() viewDidLayoutSubviews() containerViewWillLayoutSubviews() containerViewDidLayoutSubviews()
    traitCollectionDidChange() tintColorDidChange() traitCollectionDidChange() traitCollectionDidChange()

    还没适配完又不想给用户看,可以先暂时全局关闭暗黑模式:
    在 Info.plist 文件中,添加 key 为 User Interface Style,类型为 String,value 设置为 Light 即可。

    在 iOS 13中,UIView、UIViewController 、UIWindow 有了一个 overrideUserInterfaceStyle 的新属性,可以覆盖系统的模式。

    单个页面或视图关闭暗黑模式,设置 overrideUserInterfaceStyle 为对应的模式,强制限制该视图与其子视图以设置的模式进行展示,不跟随系统模式改变进行改变。

    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    

    设置此属性会影响当前view/viewController/window 以及它下面的任何内容。

    如果你希望一个子视图监听系统的模式,请将 overrideUserInterfaceStyle 属性设置为.unspecified。

    颜色

    系统颜色

    在 iOS 13中,苹果引入了全新系统颜色,系统颜色是动态的,会根据当前系统是默认模式还是暗黑模式动态调整颜色。

    苹果还提供了一组动态的灰度颜色。

    语义化颜色

    苹果提供了一套根据颜色使用目的而约定颜色命名的语义化颜色。语义化颜色也是动态颜色。

    例如系统背景色(SystemBackground)、分割线颜色(SeparatorColor)等等,使用语义化颜色确保你的 App 具有和系统应用高度类似的配色风格。通过使用语义化颜色,可以让你的 App 更加贴近原生体验,这是官方希望达到的最佳体验。

    以上两种动态颜色,是 iOS 13 才支持的新特性,并且颜色有限,大概率不能满足 App 的使用,继续往下看。

    自定义颜色:通过 Assets 配置

    在 iOS 11和 Xcode 9 中,我们可以在 Images.xcassets 中添加颜色。

    现在我们可以为颜色再配置一个用于暗黑模式的对应的颜色。

    通过代码自定义颜色

     

    + (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider;
    - (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider;
    

    iOS 13 提供了的新方法,可以在 block 中判断 traitCollection.userInterfaceStyle,根据系统模式设置返回的颜色。

     

    +(UIColor *)generateDynamicColor:(UIColor *)lightColor darkColor:(UIColor *)darkColor{
        if (@available(iOS 13.0, *)) {
            UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
                if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight) {
                    return lightColor;
                }else {
                    return darkColor;
                }
            }];
            return dyColor;
        }else{
            return lightColor;
        }
    }
    

     

    图片

    SF Symbols

    苹果在 WWDC19 上引入了 SF Symbols 。SF Symbols是一个巨大的矢量图标库(超过1500),可供开发人员在自己的 App 中使用。

    更多可以查看关于 SF Symbols 的 Session 206-Introducing SF Symbols,下载.dmg可以查看全部图标。苹果在自己的应用中使用,也推荐开发者使用。

     

    if (@available(iOS 13.0, *)) {
            _iconIV.image = [UIImage systemImageNamed:@"plus.circle"];
    }
    

    不想用 SF Symbols 的话,还有一种方式就是和自定义颜色相同的方法,在 Images.xcassets 中配置不同模式下的图片。

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

    模糊效果

    在 iOS 中,我们创建模糊效果的 UIVisualEffectView 的代码也会有明确表面明暗的情况。

    在 iOS 13 中,我们需要让这些模糊效果随着系统模式的切换而切换。UIKit 提供了新的模糊样式且是动态的,会随着系统模式的改版而自动匹配。

    利用 UIVisualEffectView 来创建一些类似模糊的效果时,不要设置类似 UIBlurEffectStyleExtraLight 这样带有明确颜色的效果,而是设置 UIKit 中新提供的动态样式的效果,比如 UIBlurEffectStyleSystemThinMaterialLight 或 UIBlurEffectStyleSystemThinMaterialDark。

     

    UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleSystemMaterial];
    UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
    

    启动图

    如果我们的 App 使用了 LaunchImage 作为启动屏,那么就应该考虑把 LaunchImage 换成 LaunchScreen.storyboard 了,因为在 Xcode 11 中 LaunchImage 并不能像普通的图片那样针对深色模式设置另外的一张图片。

    富文本

    给 Attributed String 加上一个 foregroundColor 属性,设置动态的颜色即可。

     

    [attr addAttribute:NSForegroundColorAttributeName value:[UIColor labelColor] range:NSMakeRange(10, 20)];
    

    layer

    关于 layer 的话,可以通过调用 view. traitcollection 从 view 中获得当前的 UITraitCollection。

     

    UIColor *resolvedColor = [[UIColor labelColor] resolvedColorWithTraitCollection:self.view.traitCollection];
    label.layer.borderColor = resolvedColor.CGColor;
    

    如果我们需要解析多种颜色,UITraitCollection 有一个方便的 performAsCurrent() 方法:

     

    [self.view.traitCollection performAsCurrentTraitCollection:^{
        for (UIColor *color in self.colorsArr) {
            // 批量拿到 color.CGColor
        }
    }];
    

    调试 dark mode

    storyboards 和 xib 文件,现在可以切换界面之间的样式是默认还是暗黑了。

    在模拟器上,也可以直接切换暗黑模式进行调试了。

    一些新变更

    UIActivityIndicatorView 的 style 变更了。
    iOS 13前 的 UIActivityIndicatorViewStyle:

     

    typedef NS_ENUM(NSInteger, UIActivityIndicatorViewStyle) {
        UIActivityIndicatorViewStyleWhiteLarge,
        UIActivityIndicatorViewStyleWhite,
        UIActivityIndicatorViewStyleGray,
    };
    
    

    iOS 13后,由于暗黑模式,上述三个属性都被废弃,建议使用如下 style:

     

    typedef NS_ENUM(NSInteger, UIActivityIndicatorViewStyle) {
        UIActivityIndicatorViewStyleMedium,
        UIActivityIndicatorViewStyleLarge,
        UIActivityIndicatorViewStyleWhiteLarge API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleLarge", 
        UIActivityIndicatorViewStyleWhite API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleMedium",
        UIActivityIndicatorViewStyleGray API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleMedium", 
    };
    

    Status Bar 的 style 变更了。

    在 iOS 13 之前,状态栏的样式的枚举值也带有着明显的颜色倾向,UIStatusBarStyleDefault、UIStatusBarStyleLightContent。

    现在,状态栏的 default 样式会根据当前的模式展示不同的颜色,而原有的 lightContent 样式则新增一个 darkContent 的样式与之对应。

     

    typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
        UIStatusBarStyleDefault      = 0, // Automatically chooses light or dark content based on the user interface style
        UIStatusBarStyleLightContent = 1, // Light content, for use on dark backgrounds
        UIStatusBarStyleDarkContent  = 3, // Dark content, for use on light backgrounds
    };
    

     

    参考资料:

    How To Adopt Dark Mode In Your iOS App

    Backwards compatibility for iOS 13 system colors

    写给设计师的指南:iOS 13 Dark Mode 深度解析



    作者:koin447
    链接:https://www.jianshu.com/p/af9ab7a33e8f
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • #13; 1、Sign up/in 1.1 用户登录安全原则 不能在网络上传输用户隐私数据的明文。 不能在本地和服务器上存储用户隐私数据的明文。 1.2 用户登录流程 登录成功之后,应该跳转视图控制到主页。 如果用户上次...
  • 虞斌 高级系统架构师、IT高级顾问、软件开发专家,有着极为丰富的工程项目背景,技术领域涵盖了从芯片设计、微控制/嵌入式系统设计和开发、手机/移动设备到网络安全设备、高性能网站和大型企业应用的系统架构...
  • 近日LumaFusion发布了最新2.1版本更新,可以利用iOS 13和iPad OS全新的功能,允许用户通过外接驱动器,如SD卡、移动硬盘、闪存启动器等,从中可以导入和导出视频文件。此外,新版LumaFusion...
  • 带有Expo的多屏启动器 网络演示: 盒子外面 博览会SDK 40 React Navigation v4和主题支持! iOS 13外观支持(带有 ) 预加载/缓存本地资产 SVG自定义图标用法 iOS缺口检查器:iPhoneX,iPhoneXs,iPhoneXr,...
  • 弗洛莫-源码

    2021-02-16 05:20:50
    2,脚本添加到启动器,在负一屏widiget中添加jsbox的启动器 注:iOS14的小组件无法交互,依然使用的ios13的小部件 3,点击flomo,发送文字。完成 二,Taio用法 Appstore里下载Taio,现在暂时未收费,是一个文本处理...
  • Delphi Icon Generator (MobileGFX)  ... 有2种不同的平台(iOS和Android),3种不同的设备类型(iPhone,iPad,Android)和13种不同比例的图标/启动器图形大小(1:1、1.33:1等),所有这些组合在一起需要大笔...
  • 适配iOS13API,提高app整体的操作流畅度和UI用户体验; 负责蓝牙标签打印、票据打印模块(码牌等不具备打印功能的设备,收款成功时在蓝牙打印机打印); 负责有品的开单模块(购物车、SKU、下单、结算、订单捡起、...
  • OpenGL ES 3.0

    2018-11-21 09:36:02
    我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。  第4章——着色和程序  着色对象和程序对象是OpenGL ...
  • 2、苹果手机升级到IOS10.0版本,CarPlay/IPOD连接后播无法通过扬声发出声音问题(声音从手机端输出) 3、偶发界面切换黑屏问题:新版软件集成CSR芯片最新库文件,改善调用接口无返回问题,解决偶发界面切换黑屏问题...
  • ✅ BlinkMath:iOS app,累了眨眨眼,动动脑! 2020年3月23号添加 ZhangPingFan(深圳) - Github, 博客 ✅ FastCode:可以随时随地编辑运行前端代码的利器 ✅ 今日趋势:帮助您快速了解全网热点和市场行情的...
  • 9 1.4 开始学习html5 10 1.4.1 规范 10 1.4.2 浏览器 11 1.4.3 控制台与调试 11 1.4.4 性能 13 1.5 基本的绘制操作 15 1.6 事件处理 18 1.6.1 鼠标事件 18 1.6.2 键盘事件 22 .1.6.3 触摸事件 23 1.7 ...
  • 构建Adobe AIR应用程序

    2013-10-24 17:00:53
    创建第一个用于 iOS 的 AIR 应用程序 使用 Dreamweaver 创建第一个基于 HTML 的 AIR 应用程序 使用 AIR SDK 创建第一个基于 HTML 的 AIR 应用程序 使用 Flex SDK 创建第一个桌面 AIR 应用程序 使用 Flex SDK ...
  • AirPlayer录屏大师

    2018-12-14 09:28:54
     Apowersoft录屏王包含安卓、苹果和PC三个版本,Apowersoft苹果版采用了iOS设备所独有的AirPlay镜像技术,只需通过连接相同的Wi-Fi,并在iOS端启用该镜像功能,便可将iPhone/iPad内的任意视频、音频、图片、文件等...
  • 13. 编辑动态面板和中继时,减少了页面标签的数量,优化编辑体验,新增隔离功能。 14. 文本字符的行距和间距的调整更加精确灵活。 15. 元件库支持导入本地图片文件夹。 16. 元件支持添加多条注释说明,在查看HTML...
  • 13. 编辑动态面板和中继时,减少了页面标签的数量,优化编辑体验,新增隔离功能。 14. 文本字符的行距和间距的调整更加精确灵活。 15. 元件库支持导入本地图片文件夹。 16. 元件支持添加多条注释说明,在查看HTML...
  • 第3 章 引导启动程序(BOOT) 35 31 概述 35 32 总体功能 35 33 BOOTSECTS 程序 36 34 SETUPS 程序 43 35 HEADS 程序 55 36 本章小结 63 第4 章 初始化程序(INIT) 65 41 概述 65 42 MAINC 程序 65 43 本章小结 73 第...
  • Navicat Premium 12.0.13:一个可多重连接的数据库管理工具,支持的数据库有: MySQL、SQL Server、SQLite、Oracle 及 PostgreSQL。让管理不同类型的数据库更加方便 Qbserve V1.81:一款自动私人时间跟踪软件,...
  • 支持多画面切换,全屏切换等,包括1+4+6+8+9+13+16+25+36+64画面切换。 支持alt+enter全屏,esc退出全屏。 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)。 17套皮肤样式随意更换,所有样式全部统一,...
  • 1.协程锁功能,解决异步队列的大杀 2.抽象出Scene的概念,realm gate map location等等,都是一个个scene, 进程变成了容器,可以容纳各种Scene 3.内网消息全部使用Actor消息,一个Scene也是一个actor 4.升级到...
  • 在有状态SessionBean中,用累加,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    在有状态SessionBean中,用累加,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
  • 主要实现了一个多版本文件资源管理,可以支持多个前端离线包预置到客户端中。其中拦截请求的源码如下: <pre><code>java public class OfflineWebViewClient extends WebViewClient { (Build.VERSION...
  • Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览将获得Chrome的性能和功能 目录 摘要 I ABSTRACT II 专业名词清单 III 第一章 绪论 1 1.1 研究背景与意义 1 1.2国内外相关...
  • 1 - App启动过程中的logo 2 - 闪屏广告 3 - 首页框架出现 4 - 首页完全加载 但是,无论是用<code>SVMClassifier还是<code>KerasClassifier分类,分拣出来的结果总还包含其他内容,如下面的0阶段...
  • 它的启动速度也快得多</li><li>Dart使Flutter不需要单独的声明式布局语言,如JSX或XML,或单独的可视化界面构建,因为Dart的声明式编程布局易于阅读和可视化。所有的布局使用一种语言,...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
热门标签
关键字:

启动器ios13