精华内容
下载资源
问答
  • iOS11新特性
    2017-09-05 11:56:33

    新增框架

    新加入 SDK 的大的框架有两个,分别是负责简化和集成机器学习的 Core ML 和用来创建增强现实 (AR) 应用的 ARKit
    Core ML 所扮演的角色更多的是将已经训练好的模型转换为 iOS 可以理解的形式,并且将新的数据“喂给”模型,获取输出。抽象问题和创建模型虽然并不难,但是对模型的改进和训练可以说是值得研究一辈子的事情,这篇文章的读者可能也不太会对此感冒。好在 Apple 提供了一系列的工具用来将各类机器学习模型转换为 Core ML 可以理解的形式。籍此,你就可以轻松地在你的 iOS app 里使用前人训练出的模型。这在以前可能会需要你自己去寻找模型,然后写一些 C++ 的代码来跨平台调用,而且难以利用 iOS 设备的 GPU 性能和 Metal (除非你自己写一些 shader 来进行矩阵运算)。Core ML 将使用模型的门槛降低了很多。
    ARKit 极大降低了普通开发者玩 AR 的门槛,也是 Apple 现阶段用来抗衡 VR 的选项。可以畅想一下更多类似 Pokémon Go 的 AR 游戏 (结合实境的虚拟宠物什么的大概是最容易想到的) 能在 ARKit 和 SceneKit 的帮助下面世,甚至在 iPad Pro 现有技能上做像是 AR 电影这样能全方位展示的多媒体可能也不再是单纯的梦想。

    Xcode 编辑器和编译器

    速度就是生命,而开发者的生命都浪费在了等待编译上。Swift 自问世以来就备受好评,但是缓慢的编译速度,时有时无的语法提示,无法进行重构等工具链上的欠缺成为了最重要的黑点。Xcode 9 中编辑器进行了重写,支持了对 Swift 代码的重构 (虽然还很基础),将 VCS 提到了更重要的位置,并添加了 GitHub 集成,可以进行同局域网的无线部署和调试。
    这里写图片描述

    其他值得注意的变更

    1.拖拽 - 很标准的一套 iOS API,不出意外地,iOS 系统帮助我们处理了绝大部分工作,开发者几乎只需要处理结果。UITextView 和 UITextField 原生支持拖拽,UICollectionView 和 UITableView 的拖拽有一系列专用的 delegate 来表明拖拽的发生和结束。而你也可以对任意 UIView 子类定义拖拽行为。和 mac 上的拖拽不同,iOS 的拖拽充分尊重了多点触控的屏幕,所以可能你需要对一次多个的拖拽行为做些特别处理。
    2.新的 Navigation title 设计 - iOS 11 的大多数系统 app 都采用了新的设计,放大了导航栏的标题字体。如果你想采用这项设计的话也非常简单,设置 navigation bar 的 prefersLargeTitles 即可。
    3.FileProviderFileProviderUI - 提供一套类似 Files app 的界面,让你可以获取用户设备上或者云端的文件。相信会成为以后文档相关类 app 的标配。
    4.不再支持 32 位 app - 虽然在 beta 1 中依然可以运行 32 位 app,但是 Apple 明确指出了将在后续的 iOS 11 beta 中取消支持。所以如果你想让自己的程序运行在 iOS 11 的设备上,进行 64 位的重新编译是必须步骤。
    5.DeviceCheck - 每天要用广告 ID 追踪用户的开发者现在有了更好地选择 (当然前提是用来做正经事儿)。DeviceCheck 允许你通过你的服务器与 Apple 服务器通讯,并为单个设备设置两个 bit 的数据。简单说,你在设备上用 DeviceCheck API 生成一个 token,然后将这个 token 发给自己的服务器,再由自己的服务器与 Apple 的 API 进行通讯,来更新或者查询该设备的值。这两个 bit 的数据用来追踪用户比如是否已经领取奖励这类信息。
    6.PDFKit - 这是一个在 macOS 上已经长期存在的框架,但却在 iOS 上姗姗来迟。你可以使用这个框架显示和操作 pdf 文件。
    7.IdentityLookup - 可以自己开发一个 app extension 来拦截系统 SMS 和 MMS 的信息。系统的信息 app 在接到未知的人的短信时,会询问所有开启的过滤扩展,如果扩展表示该消息应当被拦截,那么这则信息将不会传递给你。扩展有机会访问到事先指定的 server 来进行判断 (所以说你可以光明正大地获取用户短信内容了,不过当然考虑到隐私,这些访问都是匿名加密的,Apple 也禁止这类扩展在 container 里进行写入)。
    8.Core NFC - 在 iPhone 7 和 iPhone 7 Plus 上提供基础的近场通讯读取功能。看起来很 promising,只要你有合适的 NFC 标签,手机就可以进行读取。但是考虑到无法后台常驻,实用性就打了折扣。不过笔者不是很熟这块,也许能有更合适的场景也未可知。
    9.Auto Fill - 从 iCloud Keychain 中获取密码,然后自动填充的功能现在开放给第三方开发者了。UITextInputTraits 的 textContentType 中添加了 username 和 password,对适合的 text view 或者 text field 的 content type 进行配置,并填写 Info.plist 的相关内容,就可以在要求输入用户名密码时获取键盘上方的自动填充,帮助用户快速登录。

    更多相关内容
  • iOS 11正式发布了,下面整理了一些该版本下的特点还有如何进行兼容适配工作需要做的事情,希望能够给你提供到帮助。
  • 本篇文章主要介绍了详解IOS11新特性之larget title的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 本篇文章主要介绍了iOS11新特性之在你的APP中使用LargeTitle,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了浅谈iOS11新特性:新增拖拽交互体验,iOS11新引入了拖拽相关的API可以帮助开发者快速的构建拖拽交互,在iOS11中,使用这种API进行APP的开发为设计提供了一种全新维度的用户交互方式。
  • 文章分享至我的个人技术博客: ...如果没有看的朋友可以去看看:玩转iOS开发:iOS 11 新特性《Xcode 9》 (一)玩转iOS开发:iOS 11 新特性《Xcode 9》 (二)那么这一次呢, 我们来简单的了解一下, 在iOS

    文章分享至我的个人技术博客: https://cainluo.github.io/15099354591154.html


    前两篇, 我们讲了Xcode 9的一些新特性, 可以更加方便我们去写"bug".

    如果没有看的朋友可以去看看:

    那么这一次呢, 我们来简单的了解一下, 在iOS 11里, UIKit更新了一些什么东西, 可以让我们更加快捷的开发.

    转载声明:如需要转载该文章, 请联系作者, 并且注明出处, 以及不能擅自修改本文.


    Paste configuration

    我们都知道, 在iOS有一个东西叫做UIMenuController, 它是一个单例, 可以方便我们简单的去做一些复制, 粘贴等等的操作, 但在iOS 11这个粘贴功能进化了, 让我们一起来看看吧, 首先我们要有一个工程项目:

    1

    简单显示的东西就好.

    然后呢, 我们需要有一个用手势操作UIMenuController的管理者MenuManager, 详细的代码都在工程里, 大家可以去看看.

    iOS 11的时候, 苹果推出了一个东西叫做UIPasteConfiguration, 它是直接继承NSObject官方解释:

    The interface that an object implements to declare its ability to accept specific data types for pasting and for drag and drop activities.

    这个东西能用来干嘛呢?


    配置粘贴功能

    在项目里, 我们默认给TableView加了长按手势和点击手势, 便于用来控制UIMenuController.

    为了方便演示这个配置粘贴的功能, 另外多开了一个控制器, 这里我们需要声明一个全局字符串, 为的就是用来给这个粘贴功能加个唯一的标识:

    @property (nonatomic, copy) NSArray<NSString *> *acceptableTypeIdentifiers;
    

    添加了这个唯一标识, 我们就需要在Cell里给copy:的方法加点修改:

    - (BOOL)canBecomeFirstResponder {
        
        return YES;
    }
    
    - (BOOL)canPerformAction:(SEL)action
                  withSender:(id)sender {
        
        return action == @selector(copy:);
    }
    
    - (void)copy:(id)sender {
        
        if (self.model == nil) {
            return;
        }
        
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.model];
        
        [[UIPasteboard generalPasteboard] setData:data
                                forPasteboardType:CELL_TYPE];
    }
    

    这里面的CELL_TYPE就是全局的唯一标识.

    还有就是要在需要粘贴功能的控制器PasteViewController里也配置一下:

        UIPasteConfiguration *pasteConfiguration = [[UIPasteConfiguration alloc] initWithAcceptableTypeIdentifiers:@[CELL_TYPE]];
            
        self.pasteConfiguration = pasteConfiguration;
    

    并且这里我们还要重写一个方法:

    - (void)pasteItemProviders:(NSArray<NSItemProvider *> *)itemProviders {
        
        for (NSItemProvider *item in itemProviders) {
            
            [item loadObjectOfClass:TableViewCellModel.class
                  completionHandler:^(id<NSItemProviderReading>  _Nullable object, NSError * _Nullable error) {
                     
                     if (object) {
                         
                         TableViewCellModel *model = (TableViewCellModel *)object;
                         
                         dispatch_async(dispatch_get_main_queue(), ^{
                             
                             self.targetTextField.text = [NSString stringWithFormat:@"复制的内容: %@", model.titleString];
                         });
                     }
                 }];
        }
    }
    

    用来处理粘贴后的数据.

    PS: 这里的TableViewCellModel是需要遵守一个NSItemProviderReading协议, 并且在内部实现它的协议方法, 详情可以去代码里看看.


    拖放的基本认识

    iOS 11, 苹果爸爸终于把拖放的功能添加进来了, 但这个功能真正受益的是iPad, 它可以在分屏App里实现数据复制和移动, 甚至还可以共享.

    我们在拖动的过程中, 数据会被序列化, 然后呈现在用户拖动的系统控制预览中, 在拖动完成后, 序列化的数据会被复制到目的地, 然后反序列化, 最终将这些信息呈献给用户.

    而最先获得支持的两个控件就是UITableViewUICollectionView. 现在让我们来新建个工程看看是如何操作.

    这里我们还是一个简单的TableView:

    2

    这里我们要介绍两个新的代理UITableViewDragDelegate, 和UITableViewDropDelegate, 一个分别拖动, 一个分别是放下的代理.

    这里我们要声明一个遵守了NSItemProviderReading, NSItemProviderWritingModel, 内部实现在工程里查看:

    最终我们去实现拖放功能的就是要去实现那两个代理的方法:

    #pragma mark - Table View Drag Delegate
    - (NSArray<UIDragItem *> *)tableView:(UITableView *)tableView
            itemsForBeginningDragSession:(id<UIDragSession>)session
                             atIndexPath:(NSIndexPath *)indexPath {
        
        ListModel *model = self.dataSource[indexPath.row];
        
        NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithObject:model];
        
        UIDragItem *dragItem = [[UIDragItem alloc] initWithItemProvider:itemProvider];
        
        return @[dragItem];
    }
    
    #pragma mark - Table View Drop Delegate
    - (void)tableView:(UITableView *)tableView
    performDropWithCoordinator:(id<UITableViewDropCoordinator>)coordinator {
        
        if (!coordinator) {
            return;
        }
        
        NSIndexPath *destinationIndexPath = coordinator.destinationIndexPath;
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [tableView performBatchUpdates:^{
                
                [coordinator.items enumerateObjectsUsingBlock:^(id<UITableViewDropItem>  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                    
                    if (!obj) {
                        return;
                    }
                    
                    NSIndexPath *indexPath = obj.sourceIndexPath;
    
                    ListModel *model = self.dataSource[indexPath.row];
    
                    [self.dataSource removeObject:model];
                    [self.dataSource insertObject:model
                                          atIndex:destinationIndexPath.row];
    
                    [tableView moveRowAtIndexPath:indexPath
                                      toIndexPath:destinationIndexPath];
                }];
                
            } completion:nil];
        });
    }
    
    - (BOOL)tableView:(UITableView *)tableView
    canHandleDropSession:(id<UIDropSession>)session {
        return [session canLoadObjectsOfClass:ListModel.class];
    }
    
    - (UITableViewDropProposal *)tableView:(UITableView *)tableView
                      dropSessionDidUpdate:(id<UIDropSession>)session
                  withDestinationIndexPath:(nullable NSIndexPath *)destinationIndexPath {
        
        return [[UITableViewDropProposal alloc] initWithDropOperation:UIDropOperationMove
                                                               intent:UITableViewDropIntentInsertAtDestinationIndexPath];
    }
    

    代码写完了之后, 别忘了把TableView的拖放功能给打开:

            _tableView.dragInteractionEnabled = YES;
    

    效果图这里就不放了, 自己去跑跑Demo就好了, 个人认为自己写的代码还是挺规整的~~哈哈

    更详细的内容会在后续的文章慢慢讲解.


    TableView侧边栏的改进

    iOS 8的时候, 苹果爸爸就为TableView引进了侧边栏的功能, 叫做UITableViewRowAction, 不过在iOS 11的时候, 苹果爸爸又增加了一个更加灵活的东西, 叫做UISwipeActionsConfiguration:

    我们另外建一个工程来看看, 然后实现我们的配置:

    - (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        UIContextualAction *contextualAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal
                                                                                       title:@"Add"
                                                                                     handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
                                                                                         
                                                                                         NSLog(@"Add");
                                                                                     }];
        
        contextualAction.backgroundColor = [UIColor brownColor];
        
        UISwipeActionsConfiguration *swipeActionsCOnfiguration = [UISwipeActionsConfiguration configurationWithActions:@[contextualAction]];
        
        return swipeActionsCOnfiguration;
    }
    
    - (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView
    leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        UIContextualAction *contextualAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal
                                                                                       title:@"Copy"
                                                                                     handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
                                                                                         
                                                                                         NSLog(@"Copy");
                                                                                     }];
        
        contextualAction.backgroundColor = [UIColor blackColor];
        
        UISwipeActionsConfiguration *swipeActionsCOnfiguration = [UISwipeActionsConfiguration configurationWithActions:@[contextualAction]];
        
        return swipeActionsCOnfiguration;
    }
    

    3
    4

    关于TableView刷新的时候, 我们还有一个专门的API:

    - (void)performBatchUpdates:(void (NS_NOESCAPE ^ _Nullable)(void))updates completion:(void (^ _Nullable)(BOOL finished))completion API_AVAILABLE(ios(11.0), tvos(11.0));
    

    刚刚的拖放功能也是在这里面完成刷新数据源的, 这么做的话, 可以让我们的逻辑结构更加的清晰, 这样子我们也需要在使用dispatch_async(dispatch_get_main_queue(), ^{});去更新了, 爽爽滴~~


    Asset UIColor的集成

    Xcode 9里, Asset里可以集成UIColor的目录, 这样子我们就可以省略声明一大堆的颜色, 详细怎么做呢? 我们一起来看看, 这里随便弄一个项目就好了.

    然后我们在Assets.xcassets里添加Color Set:

    5

    然后添加自己喜欢的颜色值:

    6

    7

    这里我们要看看两个API, 都是在iOS 11之后才出来的

    + (nullable UIColor *)colorNamed:(NSString *)name
    
    + (nullable UIColor *)colorNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection
    

    最终效果:

    8


    新添加的辅助功能

    在讲这个得时候, 这里是需要装有iOS 11的真机设备.

    但由于我现在手上没有iOS 11的设备, 所以这里暂时不说, 有兴趣的话, 可以到百度去搜搜, 或者等我iOS 11设备的时候再更新吧.


    总结

    iOS 11更多的东西都是在优化和改进开发的流程, 这篇张文章只是简单的介绍一下而已, 还有更多更深层次的可以自行去查阅苹果的官方文档, 或者是去看看WWDC的视频演示:


    工程地址

    项目地址: https://github.com/CainRun/iOS-11-Characteristic/tree/master/2.UIKit


    作者:CainLuo
    链接:https://juejin.im/post/5a017dd7518825297a0e29ca
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。





     


    展开全文
  • iOS 11新特性之人脸检测
  • iPhone X 设计适配指南 & iOS 11 新特性,一边文章精准剖析iPhone X适配
  • iOS 14新特性与适配要点,swift中iOS的适配要点,以及ios14的一些新特性iOS 14新特性与适配要点,swift中iOS的适配要点,以及ios14的一些新特性
  • iOS11新特性,如何适配iOS11

    万次阅读 2017-07-26 10:03:51
    这几天抽空把WWDC的Session看了一些,总结了一些iOS11新特性,可能对我们的App有影响,需要我们进行适配。本文作为一个总结。 本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 ...

    前言

    这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配。本文作为一个总结。

    本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 UIScrollViewUITableView 的更新和功能更强大的滑动操作。

    一. 在UIKit’s Bars中加入的新功能

    WWDC通过iOS新增的文件管理App:Files开始介绍,在Files这个APP中能够看到iOS11中UIKit’s Bars的一些新特性:在浏览功能上的大标题视图(向上滑动后标题会回到原来的UI效果)、横屏状态下tab上的文字和icon会变为左右排列。我用iOS11的模拟器体验了一下Files这个APP,如下图所示:






    (command+向左的箭头让模拟器横屏)
    在iPhone上,tab上的图标较小,tab bar较小,这样垂直空间可多放置内容。如果有人看不清楚tab bar上的图标或文字,可以通过长按tab bar上的任意item,会将该item显示在HUD上,这样可以清楚的看清icon和text。对tool bar 和 navigation bar同理,长按item也会放大显示。如下图显示:




    UIBarItem

    UIBarItem是UI tab bar item和UI bar button item的父类,要想实现上面介绍的效果,只需要为UIBarItem 设置landscapeImagePhone属性,在storyboard中也支持这个设置,对于HUD的image需要设置另一个iOS11新增的属性:largeContentSizeImage,关于这部分更详细的讨论,可以参考 WWDC2017 Session 215:What's New in Accessibility

    控制大标题的显示

    在UI navigation bar中新增了一个BOOL属性prefersLargeTitles,将该属性设置为ture,navigation bar就会在整个APP中显示大标题,如果想要在控制不同页面大标题的显示,可以通过设置当前页面的navigationItemlargeTitleDisplayMode属性;

    navigationItem.largeTitleDisplayMode 
    
    typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {  
    /// 自动模式依赖上一个 item 的特性
    UINavigationItemLargeTitleDisplayModeAutomatic,
    /// 针对当前 item 总是启用大标题特性
    UINavigationItemLargeTitleDisplayModeAlways,
    /// Never 
    UINavigationItemLargeTitleDisplayModeNever,
    }

    Navigation 集成 UISearchController

    把你的UISearchController赋值给navigationItem,就可以实现将UISearchController集成到Navigation

    navigationItem.searchController  //iOS 11 新增属性
    navigationItem.hidesSearchBarWhenScrolling //决定滑动的时候是否隐藏搜索框;iOS 11 新增属性

    UINavigationController和滚动交互

    滚动的时候,以下交互操作都是由UINavigationController负责调动的:

    UIsearchController搜索框效果更新
    大标题效果的控制
    Rubber banding效果 //当你开始往下拉,大标题会变大来回应那个滚轮

    所以,如果你使用navigation bar,组装一些整个push和pop体验,你不会得到searchController的集成、大标题的控制更新和Rubber banding效果,因为这些都是由UINavigationController控制的。

    UIToolbar and UINavigationBar— Layout

    在 iOS 11 中,当苹果进行所有这些新特性时,也进行了其他的优化,针对 UIToolbar 和 UINavigaBar 做了新的自动布局扩展支持,自定义的bar button items、自定义的title都可以通过layout来表示尺寸。
    需要注意的是,你的constraints需要在view内部设置,所以如果你有一个自定义的标题视图,你需要确保任何约束只依赖于标题视图及其任何子视图。当你使用自动布局,系统假设你知道你在做什么。

    Avoiding Zero-Sized Custom Views

    自定义视图的size为0是因为你有一些模糊的约束布局。要避免视图尺寸为0,可以从以下方面做:

    • UINavigationBar 和 UIToolbar 提供位置
    • 开发者则必须提供视图的size,有三种方式:

      • 对宽度和高度的约束;
      • 实现 intrinsicContentSize;
      • 通过约束关联你的子视图;

    二. 管理margins 和 insets

    layout margins

    基于约束的Auto Layout,使我们搭建能够动态响应内部和外部变化的用户界面。Auto Layout为每一个view都定义了marginmargin指的是控件显示内容部分的边缘和控件边缘的距离。
    可以用layoutMargins或者layoutMarginsGuide属性获得view的margin,margin是视图内部的一部分。layoutMargins允许获取或者设置UIEdgeInsets结构的marginlayoutMarginsGuide则获取到只读的UILayoutGuide对象。

    在iOS11新增了一个属性:directional layout margins,该属性是NSDirectionalEdgeInsets结构体类型的属性:

    typedef struct NSDirectionalEdgeInsets {  
        CGFloat top, leading, bottom, trailing;
    } NSDirectionalEdgeInsets API_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));

    layoutMarginsUIEdgeInsets结构体类型的属性:

    typedef struct UIEdgeInsets {  
    CGFloat top, left, bottom, right;
    } UIEdgeInsets;

    从上面两种结构体的对比可以看出,NSDirectionalEdgeInsets 属性用leading 和 trailing 取代了之前的 left 和 right。

    directional layout margins属性的说明如下:

    directionalLayoutMargins.leading is used on the left when the user interface direction is LTR and on the right for RTL.
     Vice versa for directionalLayoutMargins.trailing.

    例子:当你设置了trailing = 30;当在一个right to left 语言下trailing的值会被设置在view的左边,可以通过layoutMargin的left属性读出该值。如下图所示:




    还有其他一些更新。自从引入layout margins,当将一个view添加到viewController时,viewController会修复view的的layoutMargins为UIKit定义的一个值,这些调整对外是封闭的。从iOS11开始,这些不再是一个固定的值,它们实际是最小值,你可以改变view的layoutMargins为任意一个更大的值。而且,viewController新增了一个属性:viewRespectsSystemMinimumLayoutMargins,如果你设置该属性为"false",你就可以改变你的layoutMargins为任意你想设置的值,包括0,如下图所示:



    安全区域(Safe Area)

    如下图:照片应用程序




    从iOS 7以来,我们在整个操作系统中都有这些半透明的bars,苹果鼓励我们通过这些bars绘制内容,我们是通过viewController 的edgesForExtendedLayout属性来做这些的。
    iOS 7 开始,在 UIViewController中引入的 topLayoutGuide bottomLayoutGuide 在 iOS 11 中被废弃了!取而代之的就是safeArea的概念,safeArea是描述你的视图部分不被任何内容遮挡的方法。 它提供两种方式:safeAreaInsetssafeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域如图所示:




    如果有一个自定义的viewController,你可能要添加你自己的bars,增加safeAreaInsets的值,可以通过一个新的属性:addtionalSafeAreaInsets来改变safeAreaInsets的值,当你的viewController改变了它的safeAreaInsets值时,有两种方式获取到回调:

    UIView.safeAreaInsetsDidChange()
    UIViewController.viewSafeAreaInsetsDidChange()

    三. UIScrollView and UITableView的新特性

    Scroll Views

    如果有一些文本位于UI滚动视图的内部,并包含在导航控制器中,现在一般navigationContollers会传入一个contentInset给其最顶层的viewController的scrollView,在iOS11中进行了一个很大的改变,不再通过scrollView的contentInset属性了,而是新增了一个属性:adjustedContentInset,通过下面两种图的对比,能够表示adjustContentInset表示的区域:







    新增的contentInsetAdjustmentBehavior属性用来配置adjustedContentInset的行为,该结构体有以下几种类型:

    typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {  
        UIScrollViewContentInsetAdjustmentAutomatic, 
        UIScrollViewContentInsetAdjustmentScrollableAxes,
        UIScrollViewContentInsetAdjustmentNever,
        UIScrollViewContentInsetAdjustmentAlways,
    }
    
    @property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior;
    @property(nonatomic, readonly) UIEdgeInsets adjustedContentInset;
    
       //adjustedContentInset值被改变的delegate
    - (void)adjustedContentInsetDidChange; 
    - (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView;

    Table Views :在iOS 11中默认启用Self-Sizing

    这个应该是UITableView最大的改变。我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容,实现了estimatedRowHeight属性后,得到的初始contenSize是个估算值,是通过estimatedRowHeight xcell的个数得到的,并不是最终的contenSizetableView不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的contenSize。创建tableView到显示出来的过程中,contentSize的计算过程如下图:





    Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension

    @property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable

    如果目前项目中没有使用estimateRowHeight属性,在iOS11的环境下就要注意了,因为开启Self-Sizing之后,tableView是使用estimateRowHeight属性的,这样就会造成contentSize和contentOffset值的变化,如果是有动画是观察这两个属性的变化进行的,就会造成动画的异常,因为在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是最终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。iOS11下不想使用Self-Sizing的话,可以通过以下方式关闭:

    self.tableView.estimatedRowHeight = 0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;

    iOS11下,如果没有设置estimateRowHeight的值,也没有设置rowHeight的值,那contentSize计算初始值是 44 * cell的个数,如下图:




    Table Views:separatorInset 扩展

    iOS 7 引入separatorInset属性,用以设置 cell 的分割线边距,在 iOS 11 中对其进行了扩展。可以通过新增的UITableViewSeparatorInsetReference枚举类型的separatorInsetReference属性来设置separatorInset属性的参照值。

    typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {  
        UITableViewSeparatorInsetFromCellEdges,   //默认值,表示separatorInset是从cell的边缘的偏移量
        UITableViewSeparatorInsetFromAutomaticInsets  //表示separatorInset属性值是从一个insets的偏移量
    }

    下图清晰的展示了这两种参照值的区别:





    Table Views 和 Safe Area

    有以下几点需要注意:

    • separatorInset 被自动地关联到 safe area insets,因此,默认情况下,表视图的整个内容避免了其根视图控制器的安全区域的插入。
    • UITableviewCellUITableViewHeaderFooterView的 content view 在安全区域内;因此你应该始终在 content view 中使用add-subviews操作。
    • 所有的 headers 和 footers 都应该使用UITableViewHeaderFooterView,包括 table headers 和 footers、section headers 和 footers。

    滑动操作(Swipe Actions)

    在iOS8之后,苹果官方增加了UITableVIew的右滑操作接口,即新增了一个代理方法(tableView: editActionsForRowAtIndexPath:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,我们可以在这个代理方法中定义所需要的操作按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction。这个类只能定义按钮的显示文字、背景色、和按钮事件。并且返回数组的第一个元素在UITableViewCell的最右侧显示,最后一个元素在最左侧显示。从iOS 11开始有了一些改变,首先是可以给这些按钮添加图片了,然后是如果实现了以下两个iOS 11新增的代理方法,将会取代(tableView: editActionsForRowAtIndexPath:)代理方法:

    // Swipe actions
    // These methods supersede -editActionsForRowAtIndexPath: if implemented
    - (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath
    - (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath

    这两个代理方法返回的是UISwipeActionsConfiguration类型的对象,创建该对象及赋值可看下面的代码片段:

     - ( UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
        //删除
        UIContextualAction *deleteRowAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"delete" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
            [self.titleArr removeObjectAtIndex:indexPath.row];
            completionHandler (YES);
        }];
        deleteRowAction.image = [UIImage imageNamed:@"icon_del"];
        deleteRowAction.backgroundColor = [UIColor blueColor];
    
        UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[deleteRowAction]];
        return config;
    }

    创建UIContextualAction对象时,UIContextualActionStyle有两种类型,如果是置顶、已读等按钮就使用UIContextualActionStyleNormal类型,delete操作按钮可使用UIContextualActionStyleDestructive类型,当使用该类型时,如果是右滑操作,一直向右滑动某个cell,会直接执行删除操作,不用再点击删除按钮,这也是一个好玩的更新。

    typedef NS_ENUM(NSInteger, UIContextualActionStyle) {
        UIContextualActionStyleNormal,
        UIContextualActionStyleDestructive
    } NS_SWIFT_NAME(UIContextualAction.Style)

    滑动操作这里还有一个需要注意的是,当cell高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。我写demo测试的时候,因为每个cell的高度都较小,所以只显示image,然后我增加cell的高度后,就可以同时显示image和title了。见下图对比:



    总结

    大概介绍了iOS 11的UI方面的一些更新,大部分内容自己代码测试过了,有些更新确实是很实用,可以适配下iOS 11,有的更新可能会给现有APP造成bug,所以学习下这些内容还是很有必要的。



    展开全文
  • iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆、动态的...下面这篇文章主要给大家总结介绍了关于iOS 11的一些新特性适配实践,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
  • iOS 14新特性

    千次阅读 2020-06-23 17:08:46
    iOS 14新特性 文章目录iOS 14新特性✨ 1.Widgets(小组件)????2.App Library(App资源库)✨3. Picture in Picture(画中画)????4.Siri????5.Messages、Memoji✨6.App Clip(小程序)✨7.iOS 14 Developer beta 测试版 ...

    iOS 14新特性


    ✨:重点 🌛:了解 🐢:无关紧要

    ✨ 1.Widgets(小组件)

    小组件这个功能其实原来就有的,只不过原来是在负一页面(首页左滑)中显示,在iOS 14中,苹果让它可以在主屏幕中添加了,与你的APP一起呈现。

    原来的小组件是可以自定义高度的,但在新版的iOS14中,苹果针对小组件做了重新设计,定义了一些尺寸供开发者使用,不清楚还能不能自定义。

    新版的小组件还有个智能叠放功能,它可以在不同的时间呈现不同的小组件。
    以下是iOS 13的负一页面
    在这里插入图片描述

    以下iOS 14的负一页面
    在这里插入图片描述

    🌜2.App Library(App资源库)

    这个功能简直就是强迫症患者的福音了,这个功能比现有的App文件夹还要高端上流。我们都知道,随着手机的储存容量越来越大,App也装的越来越多,就导致手机的页面也越来越多,有时候找App需要翻好几页才能找到。App资源库可以把你的App自动整理起来,而且它也可以隐藏你的其它页面,不需要在现实那么多页面。

    隐藏方式是长按App进入摇动模式,点击底部的翻页提示圆点,就出现App页面的缩放视图。
    App资源库则是在你的页面的最后一页(右滑最后一页)。

    ✨3. Picture in Picture(画中画)

    这个功能其实早就有了,但是一直是应用在iPad中,就是再把App放到后台之后,屏幕上出现了一个悬浮窗口播放功能。视频悬浮在应用程序外之后,用户可以很流畅的调节视频窗口大小,特别的是用户还可将它折叠到屏幕侧面以继续在后台播放。

    🌛4.Siri

    原来的Siri使用是全屏交互界面,会覆盖App页面。但在iOS 14做了重新的设计,底部出现新的Siri标志,然后使用Siri打开某个App,会从底部弹出。而查询天气是在顶部已通知栏的形式呈现出来。
    苹果推出来一个新的App,Translate-一款简单易用的翻译软件,可以离线使用,借助机器学习技术和神经网络引擎技术可以翻译文本和语音,支持中文、英语等11中语言

    🐢5.Messages、Memoji

    新增了消息置顶功能,被置顶的发件人来信息是有特殊动画效果。
    memoji新加了表情,有了口罩表情,具体自行查看

    ✨6.App Clip(小程序)

    接下来是,WWDC20新出的特性,App Clip(小程序)功能了,它是App的一小部分, 支持苹果支付和苹果登录功能,WWDC对他的描述是这样的“Light and fast,Easy to discover”
    启动方法可以通过浏览器启动、短信消息MapsNFC、或者二维码打开App Clip。

    苹果自己也推出了小程序码App Clips码,使用相机扫描就可打开,开发者使用Xcode和新的SDK的全部功能开发主App的一部分功能,大小不能超过10M

    小结:
    1.目前已知的是他有自己的`App Clips码`,说明需要上架审核,具体时间不清楚,或者已有的App可能会在Connect上可以申请一个`App Clips码`。
    2.Xcode和最新SDK的全部功能开发,就是可以自定义小程序,功能不单一,开发语言应该是OC或者Swift
    

    ✨7.iOS 14 Developer beta 测试版

    苹果已经发布了iOS 14 Developer beta预览版,用户可以通过下载描述文件来更新最新的iOS14抢先体验一波。
    点击链接到Safari浏览器下载描述文件,然后到设置->通用->软件更新,更新最新iOS14系统

    而开发者也可以到官网下载最新的Xcode12 beta版,先尝试使用吧Xcode 12 Beta发行说明
    注意,Xocde12 beta 只支持macOS 10.15.4
    目前仅发布了测试beta版,正式版官方还没定时间,要等iOS 14正式发布

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

    展开全文
  • 主要介绍了110.iOS10新特性适配教程XCode8新特性解析的相关资料,需要的朋友可以参考下
  • iOS9新特性之UIStackView

    2020-08-29 07:21:26
    UIStackView主要包括了四大属性:axis、alignment、distribution、spacing。下面通过本文给大家介绍iOS9新特性之UIStackView的相关知识,感兴趣的朋友一起看看吧
  • iOS15新特性iOS15适配

    千次阅读 2021-09-24 13:55:16
    一、iOS15新特性 1.1、iOS15兼容的设备 iPhone6S以上,包括SE第一/二代,iPod touch第七代 具体6s、6sPlus、7、7Plus、8、8plus、X、XR、XsMax、Xs、1111Pro、11ProMax、12、12Pro、12ProMax、12mini、13、13...
  • 源码iOS-9-Sampler,iOS 9 新特性的代码示例。使用 Xcode 7 编译。内容包括自定义地图、文本检测、图片滤镜、CASpringAnimation、UIStackView、省电模式、字体,等等。
  • 开发者所需要知道的 iOS 10 SDK 新特性(苹果ios开发新特性
  • 开发者所需要知道的iOS7SDK新特性.春风又绿加州岸,物是人非又一年。WWDC2013keynote落下帷幕,iOS开发旅程也由此开启。在iOS7界面重大变革的背后,开发者们需要知道的又有哪些呢。同去年一样,我会先简单纵览地...
  • iOS11 新特性-Core ML (三) Core ML 实战

    千次阅读 2017-06-12 10:36:20
    上篇中我们已经生成了一个 Core ML 模型文件:HousePricer.mlmodel,本篇将介绍如何将文件引入到
  • 如果需要使用largeTitle的属性,就需要设置下面的属性, 如果不设置,默认沿用系统默认样式,也就是ios11之前的title样式 self.navigationController.navigationBar.prefersLargeTitles = YES; largetTitle的显示模...
  • iOS11新特性开发初探之 - Core NFC

    千次阅读 2017-09-21 16:42:54
    北京时间2017.6.6日凌晨1点,一届的WWDC召开,苹果在大会上发布了iOS11的beta版,虽然正式版还有一段时间才会推送,不过其中有项功能引起我的注意,即苹果官方开放了NFC的部分开发接口。虽然从iphone6开始苹果手机...
  • ios 11系统出来后,需要适配一下tableview,如果tableview的界面没有导航栏,并且想要tableview的内容和状态栏重复的话,就需要考虑到iOS11的安全区域问题了。这些是上网搜到的一位大神博客,找到了解决办法,非常...
  • 主要给大家介绍了关于iOS12新特性之推送通知的相关资料文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • DesignableMasonry 利用ios8新特性动态修改Masonry布局代码范例 简书blog文地址:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,620
精华内容 47,448
关键字:

ios11新特性

友情链接: idocConnector.zip