ios11新特性 - CSDN
精华内容
参与话题
  • iOS 11,新特性,安全区

    2017-12-26 14:27:58
    iOS11出来之后,,对iOS 来说改变最大的就是安全区,就是刘海的问题,在这块对于iOS新特性 iPhone X尺寸 APP启动页,即LaunchImages,需要五张不同尺寸大小的图,切记一定要选择png格式,...

    在iOS11出来之后,,对iOS 来说改变最大的就是安全区,就是刘海的问题,在这块对于iOS新的特性

    iPhone X尺寸

    APP启动页,即LaunchImages,需要五张不同尺寸大小的图,切记一定要选择png格式,否则打包时报错,导致APP适配失败。

    六张图的大小即:320×480、640×960、640×1136、750×1334、1242×2208、

    1125*2436

    分别对应的iphone屏幕尺寸:iphone 3GS、iphone4(s)、iphone5(c、s)、iphone6/7/8(s)、iphone 6/7/8(s) plus、iPhoneX

    具体步骤:

    Step1:

    1.点击工程目录中的Images.xcassets/Assets.xcassets,点击左侧边栏的LaunchImages(如果没有,在空白处右击创建一个)

    2.然后在xcode最右侧的边栏处选择你的APP是否要对ipad、横竖屏、以及低版本的iOS系统做支持。



    iOS 11之前,

    automaticallyAdjustsScrollViewInsets经常被设置成NO,由开发者去控制处理留白和坐标问题, 但是11+automaticallyAdjustsScrollViewInsets = NO这句代码失效。

    iOS 11后,

    把这个automaticallyAdjustsScrollViewInsets废弃,新增了contentInsetAdjustmentBehavior,这个属性是个枚举类型值,我们只需要把其设置成never就行了

    解决tableView偏移88的问题,  我们可以对对 tableView 进行如下设置:

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

    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

    } else {

    self.automaticallyAdjustsScrollViewInsets = NO;

    }



    2、导航栏适配

    导航栏新增了一种大标题样式,默认设置是不开启,所以不需要修改。

    iOS 11以前,导航栏的高度是64,其中状态栏statusBar的高度是20,底部tabbar的高度是49。

    iOS 11之后,iPhoneX的导航栏的高度是88,其中状态栏的statusBar的高度变成了44, 底部的tabbar变成了83。

    iPhoneX的底部增加了虚拟Home区,由于安全区域的原因默认tabBar的高度由49变为83,增高了34,所以自定义的底部TabBar也需要需改其适配方案。

    目前我们项目没有自定义底部TabBar, 则先不考虑吧, 先来考虑关于navi 在 iPhone X 上是88的问题.

    目前没发现有iPhoneX的机型判断API,建议使用size来做代替判断。

    #definekStatusBarHeight[[UIApplicationsharedApplication] statusBarFrame].size.height

    #define kNavBarHeight 44.0

    #define kTabBarHeight ([[UIApplication sharedApplication] statusBarFrame].size.height>20?83:49)//tabBar高

    #define kTopHeight(kStatusBarHeight + kNavBarHeight)//导航栏高

    //判断iPhoneX

    #define isiPhone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

    #defineiPhoneX[[UIScreenmainScreen] bounds].size.width >= 375.0f && [[UIScreen mainScreen] bounds].size.height >= 812.0f && isiPhone

    3、iPhone X上下显示黑条问题

    运行Xcode9.0的iPhoneX模拟器, APP在iPhoneX屏幕没填充满,上下有黑色区域,这是因为app之前未用LaunchScreen.Storyboard作为启动页面,可以使用LaunchScreen来当做入场页面,这样APP才会自动适配为iPhoneX的大小。我的项目中是用Assets中的LaunchImage, 这样就可以修改Assets中的LaunchImage,添加iPhoneX的Launch图(1125*2436)


    更新适配版本时 iPhone X 的启动图适配加上了, 千万别忘了也要传 Icon. 否则就会有上传版本时会有提示警告滴

    4、MJRefresh上拉刷新死循环

    self.tableView.estimatedRowHeight=150.0f;

    150这个数值是你cell的平均高度,如果estimatedRowHeight设置非常小,MJRefresh的KVO会监听错误的contentoffset,造成不停进行上拉加载操作。

    展开全文
  • #import "ViewController.h" @interface ViewController ()UIDragInteractionDelegate,UIDropInteractionDelegate>{  UIImageView *img1;  UIImageView *img2;  UILabel *label; }

    #import "ViewController.h"


    @interface ViewController ()<UIDragInteractionDelegate,UIDropInteractionDelegate>{

        UIImageView *img1;

        UIImageView *img2;

        UILabel *label;

    }

    @property (nonatomic,strong) UIDragInteraction *dragInteraction;

    @property (nonatomic,strong) UIDropInteraction *dropInteraction;

    @end


    @implementation ViewController


    - (void)viewDidLoad {

        [superviewDidLoad];

        // 把拖拽行为加在拖拽源上,放置行为加在放置目标上,然后分别实现拖拽行为代理(UIDragInteractionDelegate)和放置行为代理方法(UIDropInteractionDelegate),就能实现拖拽效果了

       //其他的代理方法没有写

        

        img1 = [[UIImageViewalloc]initWithFrame:CGRectMake(10,100, 100, 100)];

        img1.image = [UIImageimageNamed:@"123"];

        [self.viewaddSubview:img1];

        img1.userInteractionEnabled =YES;

        

        

        label = [[UILabelalloc]initWithFrame:CGRectMake(10,220, 200, 30)];

        label.backgroundColor = [UIColoryellowColor];

        [self.viewaddSubview:label];

        

        

        img2 = [[UIImageViewalloc]initWithFrame:CGRectMake(10,250, 100, 100)];

        img2.image = [UIImageimageNamed:@"234"];

        [self.viewaddSubview:img2];

        img2.userInteractionEnabled =YES;

        

        [img1 addInteraction:self.dragInteraction];

        

        [img2 addInteraction:self.dropInteraction];

        

        

    }



    /**

     * 必须实现的代理方法:

     */

    - (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session {

        NSItemProvider *provider = [[NSItemProvideralloc]initWithObject:@"拖拽了一个字符串过来"];

        UIDragItem *dragItemString = [[UIDragItemalloc]initWithItemProvider:provider];

        

        NSItemProvider *provider1 = [[NSItemProvideralloc]initWithObject:img1.image];

        UIDragItem *dragItemImg = [[UIDragItemalloc]initWithItemProvider:provider1];

        return @[dragItemString,dragItemImg];

    }


    - (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session {

        //如果返回nil,说明这个操作来自另外一个APP

        

        UIDropOperation dropOperation = session.localDragSession ?UIDropOperationMove:UIDropOperationCopy;

        

        UIDropProposal *dropProposal = [[UIDropProposalalloc]initWithDropOperation:dropOperation];

        return dropProposal;

    }


    //当用户进行放置后会调用,可以从session中获取被传递的数据

    - (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session {

        //这个方法内要判断是否源自本APP

        if (session.localDragSession) {

            if ([session canLoadObjectsOfClass:[NSString class]]) {

                [session loadObjectsOfClass:[NSStringclass] completion:^(NSArray<__kindofid<NSItemProviderReading>> *_Nonnull objects) {

                    label.text = objects.firstObject;

                }];

            }

            

            if ([session canLoadObjectsOfClass:[UIImage class]]) {

                [session loadObjectsOfClass:[UIImageclass] completion:^(NSArray<__kindofid<NSItemProviderReading>> *_Nonnull objects) {

                    img2.image = objects.lastObject;

                }];

            }

        }

    }



    - (UIDragInteraction *)dragInteraction {

        if (!_dragInteraction) {

            _dragInteraction = [[UIDragInteractionalloc]initWithDelegate:self];

            _dragInteraction.allowsSimultaneousRecognitionDuringLift =YES;

            _dragInteraction.enabled =YES;

        }

        return_dragInteraction;

    }



    - (UIDropInteraction *)dropInteraction {

        if (!_dropInteraction) {

            _dropInteraction = [[UIDropInteractionalloc]initWithDelegate:self];

            _dropInteraction.allowsSimultaneousDropSessions =YES;

        }

        return_dropInteraction;

    }



    - (void)didReceiveMemoryWarning {

        [superdidReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

    展开全文
  • 一、Screen Size iPhoneX的屏幕尺寸为 375pt × 812pt @3x,像素为 1125px × 2436px。可以通过判断屏幕的高度来判断设备是否是 iPhoneX,可以在全局宏定义中添加判断设备的宏定义(横竖屏通用): ...

    一、Screen Size

    iPhoneX的屏幕尺寸为 375pt × 812pt @3x,像素为 1125px × 2436px。可以通过判断屏幕的高度来判断设备是否是 iPhoneX,可以在全局宏定义中添加判断设备的宏定义(横竖屏通用):

    #define IS_IPHONE_X     (( fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)812) < DBL_EPSILON ) || (fabs((double)[[UIScreen mainScreen] bounds].size.width - (double)812) < DBL_EPSILON ))
    • 1

    如果在iPhoneX模拟器运行现有 app,出现上下屏幕没填充满的情况时,说明 app 没有适合 iPhoneX 尺寸的启动图,因此,需要添加一张 1125px × 2436px(@3x)的启动图,或者在项目中添加 LaunchScreen.xib,然后在项目的 target 中,设置启动 Launch Screen File 为 LaunchScreen.xib。

    二、safe Area

    官方指出:

    When designing for iPhone X, you must ensure that layouts fill the screen and aren’t obscured by the device’s rounded corners, sensor housing, or the indicator for accessing the Home screen.

    当我们在设计 iPhoneX app 的时候,必须确保布局充满屏幕,并且布局不会被设备的圆角、传感器外壳或者用于访问主屏幕的指示灯遮挡住。因此,苹果提出了safe area(安全区)的概念,就是上述可能遮挡界面的区域以外的区域被定义为安全区。

     

    为了尽可能的使布局和手势等不被圆角和传感器遮挡,竖屏情况下,苹果官方建议的安全区大小为左图,指定的状态栏高度为 44pt,下方指示灯处的高度为 34pt;横屏情况下为右图所示,上下安全边距分别为 0pt/21pt,左右安全边距为 44pt/44pt,如果使用了UINavigationBarUITabBar,安全区的上边缘会变成导航栏下边缘的位置,如果是自定义的navigationBar,并且还继承于UIView,就需要手动修改状态栏的高度,在我们的项目中,状态栏的高度是用的全局宏定义,因此,修改状态栏高度的宏定义为:

    #define STATUS_HEIGHT   (IS_IPHONE_X?44:20)
    
    • 1
    • 2

    增加安全区域下面的区域的高度宏定义为:

    #define BOTTOM_SAFEAREA_HEIGHT (IS_IPHONE_X? 34 : 0)
    
    • 1
    • 2

    如果你同时也用了自定义的UITabBar那么就需要修改TABBAR_HEIGHT的宏定义为:

    #define TABBAR_HEIGHT   (IS_IPHONE_X? (49 + 34) : 49)
    
    • 1
    • 2

    当需要将整个界面最下方的控件上移或者改变中间滚动视图的高度的时候,使用BOTTOM_SAFEAREA_HEIGHT这个宏,方便后期的统一维护。因为基本上每一个界面都需要下方留白,因此在BaseViewController添加属性:

    @property (nonatomic, strong) UIView *areaBelowSafeArea;

    并且统一添加到view上:

        #warning 背景色待定
        if (IS_IPHONE_X) {
            self.areaBelowSafeArea = [[UIView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT - BOTTOM_SAFEAREA_HEIGHT, SCREEN_WIDTH, BOTTOM_SAFEAREA_HEIGHT)];
            self.areaBelowSafeArea.backgroundColor = DefaultTabBarBackgroundColor;
            [self.view addSubview:self.areaBelowSafeArea];
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    也可以在特定的viewController中,自定义它的样式。

    self.areaBelowSafeArea.backgroundColor = XXX;
    • 1

    更详细:Designing for iPhone X

    三、UIScrollView及其子类

    在 iOS11 中,决定滚动视图的内容和边缘距离的属性改为adjustedContentInset,而不是原来的contentInsets,在 iOS11 之前,UIViewController有一个automaticallyAdjustsScrollViewInsets属性,并且默认值为YES,这个属性的作用为,当scrollView为控制器根视图的最上层子视图时,如果这个控制器被嵌入到UINavigationControllerUITabBarController中,那么,它的contentInsets会自动设置为(64,0,49,0);这个属性会使滚动视图中的内容不被导航栏和tabBar遮挡。

    iOS11 使用了safeAreaInsets的新属性,这个属性的作用就是规定了视图的安全区的四个边到屏幕的四个边的距离,例如在 iPhoneX 上,如果没使用或者隐藏了UINavigationBar,则safeAreaInsets = (44,0,0,34),如果既使用了UINavigationBar,又使用了UITabBar,则safeAreaInset = (88,0,0,34+49)。也可以使用additionalSafeAreaInsets属性来为系统默认的safeAreaInsets添加 insets,比如,safeAreaInsets = (44,0,0,34),设置additionalSafeAreaInsets = UIEdgeInsetsMake(-44, 0, 0, 0);,那么实际上的安全区域到屏幕边缘的insets为(0,0,0,34)

    adjustedContentInset属性的值的确定由 iOS11 API 提供的新的枚举变量contentInsetAdjustmentBehavior决定。这个属性的类型定义为:

    typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
        UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
        UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
        UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
        UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
        } API_AVAILABLE(ios(11.0),tvos(11.0));
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四个枚举值的意义分别为:

    UIScrollViewContentInsetAdjustmentAutomatic

    Content is always adjusted vertically when the scroll view is the content view of a view controller that is currently displayed by a navigation or tab bar controller. If the scroll view is horizontally scrollable, the horizontal content offset is also adjusted when there are nonzero safe area insets.

    当滚动视图的父视图所在的控制器嵌入导航控制器和标签控制器的时候,滚动视图的内容总会调整垂直方向上的 insets,如果滚动视图允许水平方向上可滚动,则当水平方向上的安全区 insets 不为 0 的时候,也会调整水平方向上的 insets。即:adjustedContentInset = safeAreaInsets + contentInsets,其中contentInsets为我们设置的滚动视图的contentInsets,下同。如下代码,

     self.scroll.contentInset = UIEdgeInsetsMake(100, 0, -34, 10);
        if (@available(iOS 11.0, *)) {
            self.scroll.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
        }else {
            self.automaticallyAdjustsScrollViewInsets = YES;
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    添加导航栏的情况下,在 iPhoneX 设备上运行打印的 log 为:

    2017-10-20 11:48:56.664048+0800 TestIphoneX[81880:2541000] contentInset:{100, 0, -34, 10}
    2017-10-20 11:48:56.664916+0800 TestIphoneX[81880:2541000] adjustedContentInset:{188, 0, 0, 10}
    2017-10-20 11:48:56.665220+0800 TestIphoneX[81880:2541000] safeAreaInset:{88, 0, 34, 0}
    • 1
    • 2
    • 3

    UIScrollViewContentInsetAdjustmentScrollableAxes

    The top and bottom insets include the safe area inset values when the vertical content size is greater than the height of the scroll view itself. The top and bottom insets are also adjusted when the alwaysBounceVertical property is YES. Similarly, the left and right insets include the safe area insets when the horizontal content size is greater than the width of the scroll view.

    adjustedContentInset = safeAreaInsets + contentInsets,它的成立依赖于滚动轴,当垂直方向上的contentSize大于滚动视图的高度时,那么垂直方向上的 insets 就由safeAreaInsets + contentInsets决定,水平方向上同理。

    宁波最好的整形医院http://www.lyxcl.org/
    宁波好的整形医院http://www.lyxcl.org/

    UIScrollViewContentInsetAdjustmentNever

    Do not adjust the scroll view insets.

    顾名思义,adjustedContentInset = contentInsets

    UIScrollViewContentInsetAdjustmentAlways

    Always include the safe area insets in the content adjustment.

    顾名思义,adjustedContentInset = safeAreaInsets + contentInsets

    由于我们的 APP 没用系统的导航控制器,但是我们用了系统的标签控制器,所以在项目中会存在 iOS11 下滚动视图的位置不对的情况,那么就可能是因为它的adjustedContentInset = safeAreaInsets + contentInsets造成的,可以这样解决:

    if (@available(iOS 11.0, *)) {
            self.scroll.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }else {
            self.automaticallyAdjustsScrollViewInsets = YES;
        }
    • 1
    • 2
    • 3
    • 4
    • 5

    或者设置additionalSafeAreaInsets抵消safeAreaInsets

    四、UITableView sectionHeader 和 sectionFooter高度问题

    iOS11 中 UITableView的 sectionHeader 和 sectionFooter 也启用了 self-sizing,即通过估算的高度乘以个数来确定tableViewcontenSize的估算值,然后随着滚动展示 section 和 cell 的过程中更新它的contenSize,iOS11 之前只有 cell 是采用的这个机制,iOS11中 sectionHeader 和 sectionFooter 也采用了这个机制,并且,如果只实现了

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
    • 1

    没实现

    - (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
    • 1

    那么系统就会直接采用估算的高度,而不是heightForHeaderInSection方法中设置的高度,也就是此时的sectionHeight

    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section
    • 1

    方法,或者estimatedSectionHeaderHeight设置的估算高度,如果没有设置估算高度,则系统默认为UITableViewAutomaticDimension

    所以必须同时实现heightForHeaderInSectionviewForHeaderInSection方法,可以返回[UIView new],但是不能不实现。或者只实现heightForHeaderInSection方法,并且设置estimatedSectionHeaderHeight为 0 来关闭估算机制。

    注:如果在 iOS11 中,使用了 self-sizing cell,并且使用了上拉加载更多,并且使用了高度自适应的方式计算 cell 的高度,那么上拉加载更多的时候会发现 tableView 会跳动一下或者滚动一段距离,什么原因呢,这里解释一下可能是由于:假如一个列表有10个 cell,你设置的估算高度是 80,那么整个列表的估算高度为10 * 80 = 800,但是实际高度不是 800,假如是 1000,那么当滚动到最下方的时候,此时的contentOffSet = 1000,然后上拉再加载 10条数据,此时会调用- (void)reloadData;方法,此时,列表的高度仍然会重新使用估算高度计算,80 * 20 = 1600,而contentOffSet = 1000,这个位置已经不是刚才的第 10条数据了,而是第1000 / 80= 12.5条数据了,因此会造成加载更多的时候数据衔接不上的问题。你可能需要设置estimatedRowHeight = 0来关闭它的估算高度解决这个问题,但是如果你非要开启它的估算高度来使 cell 中的约束自适应高度的话,可以通过这种方式计算高度:

    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static DisplayCell *cell;//‘static’将cell存储在静态存储区,这里创建的cell仅用来计算高度,因此,内存中只有一份就可以了,因为此方法会调用多次,每次都创建的话即会耗费时间也会耗费空间。
        if (!cell) {
            cell = [[[NSBundle mainBundle] loadNibNamed:kCellNibName owner:self options:nil] lastObject];
        }
        cell.displayLab.text = self.data[indexPath.row];//给cell赋值,赋值是为了通过内容计算高度
        CGFloat height = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
        return height;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    另外,如果 cell 中使用了多行 label 的话,注意设置它的换行宽度: 
    self.displayLab.preferredMaxLayoutWidth = XXX;//XXX应该和你约束的label宽度相同

    五、Tips

    1、每个界面中的控件的位置

    如果项目中用 frame 布局的控件较多,很多控件的位置依赖于self.view的顶部和底部,由于状态栏和底部空间的调整就会造成一部分控件的位置发生变化,修改过程中应该注意和线上 APP 比对。建议能用约束的就别用 frame,依赖上下控件的位置比依赖屏幕的边缘和宽高更好维护一些。autolayout 并不影响写动画!

    2、重新布局

    项目中有些控件的位置会因为响应事件、动画和数据请求等重新布局,因此应该特别注意的地方就是重新布局后控件的位置是否和线上项目一致。另外,还有一些初始化时隐藏的控件,由于某些条件发生后才展示,也要注意其布局。

    3、全屏显示

    全屏显示和横屏模式下的界面,注意横屏之后下方的感应器在安全区之外。

    4、LaunchuImage

    像素为:1125 * 2436 
    并在LaunchImage中的Contents.json文件中增加 JSON:

    {
        "extent" : "full-screen",
        "idiom" : "iphone",
        "subtype" : "2436h",
        "filename" : "图片名字.png",
        "minimum-system-version" : "11.0",
        "orientation" : "portrait",
        "scale" : "3x"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5、定位

    在 iOS 11 中必须支持 When In Use 授权模式(NSLocationWhenInUseUsageDescription),在 iOS 11 中,为了避免开发者只提供请求 Always 授权模式这种情况,加入此限制,如果不提供When In Use 授权模式,那么 Always 相关授权模式也无法正常使用。(就是为了打倒流氓软件的流氓强制定位)

    如果要支持老版本,即 iOS 11 以下系统版本,那么建议在 info.plist 中配置所有的 Key(即使 NSLocationAlwaysUsageDescription 在 iOS 11及以上版本不再使用):

    NSLocationWhenInUseUsageDescription
    NSLocationAlwaysAndWhenInUseUsageDescription
    NSLocationAlwaysUsageDescription
    • 1
    • 2
    • 3

    NSLocationAlwaysAndWhenInUseUsageDescription为 iOS 11 中新引入的一个 Key。 
    参考:WWDC17: What’s New in Location Technologies ? 
    (这是一个带简体中文字幕的视频,我并没有看!!!)

    展开全文
  • 点击标题下「异步社区」可快速关注iOS是一个强大的系统,被广泛地应用于苹果公司的系列产品iPhone、iPad和iTouch设备中。iOS通过这些移动设备展示了多点触摸、在线视频以及众多内置传感器的界面。本文将带领大家认识...

    点击标题下「异步社区」可快速关注


    iOS是一个强大的系统,被广泛地应用于苹果公司的系列产品iPhone、iPad和iTouch设备中。iOS通过这些移动设备展示了多点触摸、在线视频以及众多内置传感器的界面。本文将带领大家认识iOS这款系统,为读者步入后面知识的学习打下基础。

     1.1 iOS系统介绍

    iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Mac World大会上公布这个系统,最初是设计给iPhone使用的,后来陆续用到iPod touch、iPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS X操作系统一样,本来这个系统名为iPhone OS,直到2010年6月7日WWDC大会上才宣布改名为iOS。

    1.1.1 iOS发展史

    iOS最早于2007年1月9日的苹果Mac World大会上公布,随后于同年的6月发布第一版iOS操作系统,当初的名称为“iPhone运行OS X”。

    2007年10月17日,苹果公司发布了第一个本地化iPhone应用程序开发包(SDK)。

    2008年3月6日,苹果发布了第一个测试版开发包,并且将“iPhone runs OS X”改名为“iPhone OS”。

    2008年9月,苹果公司将iPod touch的系统也换成了“iPhone OS”。

    2010年2月27日,苹果公司发布iPad,iPad同样搭载了“iPhone OS”。

    2010年6月,苹果公司将“iPhone OS”改名为“iOS”,同时还获得了思科iOS的名称授权。

    2010年第四季度,苹果公司的iOS占据了全球智能手机操作系统26%的市场份额。

    2011年10月4日,苹果公司宣布iOS平台的应用程序已经突破50万个。

    2012年6月,苹果公司在WWDC 2012上推出了全新的iOS 6,提供了超过200 项新功能。

    2013年6月10日,苹果公司在WWDC 2013上发布了iOS 7,去掉了所有的仿实物化,整体设计风格转为扁平化设计。

    2014年6月3日,苹果公司在WWDC 2014开发者大会上正式发布了全新的iOS 8操作系统。

    2015年6月9日,苹果公司在WWDC 2015开发者大会上发布了全新的iOS 9操作系统。

    2016年6月13日,苹果开发者大会WWDC在旧金山召开,会议宣布iOS 10的测试版将在2016年夏天推出,正式版将在秋季发布。

    2017年6月6日,苹果公司在圣何塞McEnery会议中心召开了WWDC2017全球开发者大会,会上发布了iOS 11系统的测试版本,正式版于2017年秋季发布。

    1.1.2 全新的版本——iOS 11

    2017年6月6日,苹果公司在圣何塞McEnery会议中心召开了WWDC2017全球开发者大会,5000名开发者来到了发布会现场。本次发布会全程秉承“只发产品不废话”的原则,节奏极快。本次大会上苹果公司正式公布了最新版iOS系统版本iOS 11,并在随后开放了iOS 11 beta1开发者预览版下载。iOS 11系统最突出的新特性如下。

    (1)黑暗模式(Dark Mode)

    如果仅仅是“夜间模式”的功能,相信大家应该都在第三方的阅读APP上用过。开启此功能之后,系统的主色调变黑,文章反白,不仅能缓解阅读疲劳,同时还能够提供不错的护眼效果。

    (2)更强大的Siri

    无论是目前最火的人工智能,还是与苹果其他设备的整合功能,苹果都让Siri变得更加强大和智能。比如给出餐厅建议并发送导航或推送用户感兴趣的内容、创建对话,而且还将有望引入人声验证功能、Siri数据同步到iCloud,从而与Google Assistant和亚马逊Alexa抗衡。

    (3)P2P支付(类似微信红包)

    也许是来自微信的灵感,苹果iOS 11中正在测试P2P支付业务,将其整合到iOS 11上,并重新设计钱包(Wallet)应用,使得用户可通过Apple Pay或iMessage应用等转账给其他人,像发红包一样给好友转账。

    (4)FaceTime多人聊天

    FaceTime将新增群组通话功能,支持最多5人视频通话,向Skype、Facebook Messenger和Google Hangouts靠齐。FaceTime Audio也将成为默认预设的拨号或呼叫方式,就像优先发送iMessage一样,优先使用FaceTime Audio通话,从而获得高品质、高速网络的通话体验。

    (5)ARKit

    iOS SDK 11 中 Apple 给开发者,特别是 AR 相关的开发者带来了一个很棒的礼物,那就是 ARKit。ARKit 利用单镜头和陀螺仪,在对平面的识别和虚拟物体的稳定上做得相当出色。ARKit 极大降低了普通开发者玩 AR 的门槛,也是 Apple 现阶段用来抗衡 VR 的选项。

     1.2 开始iOS 11开发之旅

    要想成为一名iOS开发人员,首先需要拥有一台计算机,并运行苹果的操作系统。对于iOS 11开发人员来说,需要安装最新的MacOS 10.13系统。硬盘至少有6GB的可用空间,开发系统的屏幕越大,就越容易营造高效的工作空间。对于广大读者来说,还是建议购买一台Mac机器,因为这样的开发效率更高,也避免一些因为不兼容所带来的调试错误。除此之外,还需要加入Apple开发人员计划(Developer Program),拥有一个Apple账号。

    其实无须任何花费即可加入到Apple开发人员计划,然后下载iOS SDK(软件开发包)、编写iOS应用程序,并且在Apple iOS模拟器中运行它们。但是毕竟收费与免费之间还是存在一定的区别:免费会受到较多的限制。例如将编写的应用程序加载到iPhone中或通过App Store发布它们,需支付会员费。本文的大多数应用程序都可在免费工具提供的模拟器中正常运行,因此,接下来如何做由你决定。

    注意:如果不确定成为付费成员是否合适,建议读者先不要急于成为付费会员,而是先成为免费成员,在编写一些示例应用程序并在模拟器中运行它们后再升级为付费会员。但是,模拟器不能精确地模拟移动传感器输入和GPS数据等。

    如果读者准备选择付费模式,付费的开发人员计划提供了两种等级:标准计划(99美元)和企业计划(299美元),前者适用于要通过App Store发布其应用程序的开发人员,而后者适用于开发的应用程序要在内部(而不是通过App Store)发布的大型公司(雇员超过500)。

    注意:无论是公司用户还是个人用户,都可选择标准计划(99美元)。在将应用程序发布到App?Store时,如果需要指出公司名,则在注册期间会给出标准的“个人”或“公司”计划选项。

    无论是大型企业还是小型公司,无论是要成为免费成员还是付费成员,我们的iOS 11开发之旅都将从Apple网站开始。首先,访问Apple iOS开发中心(https://developer.apple.com/),如图1-1所示。

    ​图1-1 Apple iOS的开发中心页面

    如果通过使用iTunes、iCloud或其他Apple服务获得了Apple ID,可将该ID用作开发账户。如果目前还没有Apple ID,需要新注册一个专门用于开发的新ID,可通过注册的方法创建一个新Apple ID,注册界面如图1-2所示。注册成功后输入账号信息登录,登录成功后的界面如图1-3所示。

    ​图1-2 注册Apple ID的界面

    ​图1-3 使用Apple ID账号登录后的界面

    在成功登录Apple ID后,可以决定是加入付费的开发人员计划还是继续使用免费资源。要加入付费的开发人员计划,请再次将浏览器指向iOS开发计划网页(http://developer.apple.com/programs/ios/),并单击“Enron New”链接加入。阅读说明性文字后,单击“Continue”按钮开始进入加入流程。

    在系统提示时选择“I’m Registered as a Developer with Apple and Would Like to Enroll in a Paid Apple Developer Program”,再单击“Continue”按钮。注册工具会引导我们申请加入付费的开发人员计划,包括在个人和公司选项之间做出选择。

     1.3 工欲善其事,必先利其器——搭建开发环境

    学习iOS 11开发也离不开好的开发工具的帮助,如果使用的是MacOS 10.13系统,下载iOS 11开发工具将很容易,只需通过简单地单击操作即可。为此,在Dock中打开Apple Store,搜索Xcode 9并免费下载它,坐下来等待Mac下载完大型安装程序(约5GB)。如果你使用的不是MacOS 10.13系统,可以从iOS开发中心(http://developer.apple.com/ios)下载。

    注意:如果是免费成员,登录iOS开发中心后,很可能只能看到一个安装程序,它可安装Xcode和iOS SDK(最新版本的开发工具);如果你是付费成员,可看到指向其他SDK版本(5.1、6.0、7.0、8.0等)的链接。

    1.3.1   Xcode介绍

    要开发iOS的应用程序,需要一台安装有Xcode工具的苹果计算机。Xcode是苹果提供的开发工具集,提供了项目管理、代码编辑、创建执行程序、代码调试、代码库管理和性能调节等功能。这个工具集的核心就是Xcode程序,提供了基本的源代码开发环境。

    Xcode是一款强大的专业开发工具,可以简单快速,并以我们熟悉的方式执行绝大多数常见的软件开发任务。相对于创建单一类型的应用程序所需要的能力而言,Xcode要强大得多,设计它的目的是使我们可以创建任何想得到的软件产品类型,从Cocoa及Carbon应用程序,到内核扩展及Spotlight导入器等各种开发任务,Xcode都能完成。Xcode独具特色的用户界面可以帮助我们以各种不同的方式来漫游工具中的代码,并且可以访问工具箱下面的大量功能,包括GCC、javac、jikes和GDB,这些功能都是制作软件产品需要的。它是一个由专业人员设计、又由专业人员使用的工具。

    由于能力出众,Xcode已经被Mac开发者社区广为采纳。而且随着苹果计算机向基于Intel的Macintosh迁移,转向Xcode变得比以往任何时候都更加重要。这是因为使用Xcode可以创建通用的二进制代码,这里所说的通用二进制代码是一种可以把PowerPC和Intel架构下的本地代码同时放到一个程序包执行的文件格式。事实上,对于还没有采用Xcode的开发人员,转向Xcode是将应用程序连编为通用二进制代码的第一个必要的步骤。

    Xcode的官方地址是:https://developer.apple. com/xcode/,在此界面介绍了Xcode 9的新功能,如图1-4所示。

    ​图1-4 Xcode官方地址介绍Xcode 9的新功能

    截止到2017年6月14日,市面中最主流版本是Xcode 8,最新版本是Xcode 9 beta。

    1.3.2 下载并安装Xcode 9

    其实对于初学者来说,我们只需安装Xcode即可。通过使用Xcode,既能开发iPhone程序,也能够开发iPad程序。并且Xcode还是完全免费的,通过它提供的模拟器就可以在计算机上测试iOS程序。如果要发布iOS程序或在真实机器上测试iOS程序,就需要花99美元了。

    1.下载Xcode 9

    (1)下载的前提是先注册成为一名开发人员,打开苹果公司开发主页面https://developer.apple.com/。

    (2)登录到Xcode的下载页面https://developer.apple.com/xcode/downloads/,找到“Xcode 9”选项,如图1-5所示。

    ​图1-5 单击“Xcode 9”下载链接

    (3)如果是付费账户,可以直接在苹果官方公司网站中下载获得Xcode 9。如果不是付费会员用户,可以从网络中搜索热心网友们的共享信息,以此达到下载Xcode 9的目的。单击“Download Xcode 9 beta 2”链接后开始下载。

    2.安装Xcode

    (1)下载完成后单击打开下载的“.dmg”格式文件,双击这个下载文件后首先进行签名验证和解压缩操作,如图1-6所示。

    ​图1-6 解压缩操作

    (2)解压缩成功后会在本地硬盘中生成一个解压后的Xcode安装文件,如图1-7所示。

    ​图1-7 解压后的Xcode安装文件

    (3)双击解压后的Xcode文件开始安装,在弹出的欢迎界面中单击“Agree”按钮,如图1-8所示。

    ​图1-8 单击“Continue”按钮

    (4)在弹出的对话框中输入用户名和密码,然后单击“好”按钮,如图1-9所示。

    ​图1-9 单击“好”按钮

    (5)在弹出的新对话框中显示安装进度,如图1-10所示。

    ​图1-10 安装进度

    (6)Xcode 9的默认启动界面如图1-11所示。

    ​图1-11 启动Xcode 9后的初始界面

    注意:(1)考虑到许多初学者没有购买苹果机的预算,可以在Windows系统上采用虚拟机的方式安装OS X系统

    (2)无论读者是已经有一定Xcode经验的开发者,还是刚开始迁移的新用户,都需要对Xcode的用户界面及如何用Xcode组织软件工具有一些理解,这样才能真正高效地使用这个工具。这种理解可以加深读者对隐藏在Xcode背后的开发思想的认识,并帮助读者更好地使用Xcode。

    (3)建议读者将Xcode安装在OS X的Mac机器上,也就是装有苹果系统的苹果机上。通常来说,在苹果机器的OS X系统中已经内置了Xcode,默认目录是“/Developer/Applications”。

    (4)本文使用的Xcode 9 beat(测试)版本,苹果公司会为开发者陆续推出后续新版本。读者可以用新版本调试本文的程序,完全不妨碍读者对本文的学习。

    (5)我们可以使用苹果系统中自带App Store来获取Xcode 9,这种方式的优点是完全自动化实现,操作方便,无需经过本文上面介绍的步骤。

    1.3.3 创建iOS 11项目并启动模拟器

    (1)Xcode位于“Developer”文件夹内中的“Applications”子文件夹中,快捷图标如图1-12所示。

    ​图1-12 Xcode图标

    (2)启动Xcode 9后的初始界面如图1-13所示,在此可以设置创建新工程还是打开一个已存在的工程。

    ​图1-13 启动一个新项目

    (3)单击“Create a new Xcode project”后会出现“Choose a template…”窗口,如图1-14所示。在New Project窗口的顶部导航栏显示了可供选择的模板类别,因为我们的重点是类别iOS Application,所以,在此需要确保选择了它。而在下放区域显示了当前类别中的模板以及当前选定模板的描述。

    ​图1-14 “Choose a template…”窗口

    (4)从iOS 9开始,在“Choose a template…”窗口的左侧新增了“tvOS”选项,这是为开发苹果电视应用程序所准备的。选择“tvOS”选项后的效果如图1-15所示。

    ​图1-15 选择 “tvOS”选项后的效果

    (5)对于大多数iOS 11应用程序来说,只需选择“iOS”下的“Single View Application(单视图应用程序)”模板,然后单击“Next(下一步)”按钮即可,如图1-16所示。

    ​图1-16 单击模板“Single View Application(单视图应用程序)”

    (6)选择模板并单击“Next”按钮后,在新界面中Xcode将要求用户指定产品名称和公司标识符。产品名称就是应用程序的名称,而公司标识符创建应用程序的组织或个人的域名,但按相反的顺序排列。这两者组成了束标识符,它将用户的应用程序与其他iOS应用程序区分开来,如图1-17所示。

    ​图1-17 Xcode文件列表窗口

    例如,我们将创建一个名为“exSwift”的应用程序,设置域名是“apple”。如果没有域名,在开发时可以使用默认的标识符。

    (7)单击“Next”按钮,Xcode将要求我们指定项目的存储位置。切换到硬盘中合适的文件夹,确保没有选择复选框Source Control,再单击“Create(创建)”按钮。Xcode将创建一个名称与项目名相同的文件夹,并将所有相关联的模板文件都放到该文件夹中,如图1-18所示。

    ​图1-18 选择保存位置

    (8)在Xcode中创建或打开项目后,将出现一个类似于iTunes的窗口,用户将使用它来完成所有的工作,从编写代码到设计应用程序界面。如果这是读者第一次接触Xcode,令人眼花缭乱的按钮、下拉列表和图标将让读者感到不适。为了让读者对这些东西有大致认识,下面首先介绍该界面的主要功能区域,如图1-19所示。

    ​图1-19 Xcode 9界面

    (9)运行iOS模拟器的方法十分简单,只需单击左上角的

    ​按钮即可。例如选中“iPhone 7 Plus”选项,模拟器的运行效果如图1-20所示。

    ​图1-20 “iPhone 7 Plus”模拟器的运行效果

    1.3.4 打开一个现有的iOS 11项目

    在开发过程中,经常需要打开一个现有的iOS 11项目,例如读者打开书中附带光盘中的源代码工程。

    (1)启动Xcode 9开发工具,然后单击右下角的“Open another project…”命令,如图1-21所示。

    ​图1-21 单击右下角的“Open another project…”

    (2)此时会弹出选择目录对话框界面,在此找到要打开项目的目录,然后单击“.xcodeproj”格式的文件即可打开这个iOS 11项目,如图1-22所示。

    ​图1-22 单击“.xcodeproj”格式的文件

    另外,读者也可以直接来到要打开工程的目录位置,双击里面的“.xcodeproj”格式的文件也可以打开这个iOS 11项目。​


    本文摘自《iOS 11 开发指南》

    《iOS 11 开发指南》 

    管蕾 著

    点击封面购买纸书


    230多个实例,9小时视频讲解,Objective-C和Swift 4.0双语讲解iOS 11的新特性的完全教程

    本书循序渐进地讲解了iOS 11应用开发的知识。书中从搭建开发环境讲起,依次讲解了Objective-C语言基础,Swift 4.0语言基础,Cocoa Touch,Xcode Interface Builder界面开发,使用Xcode编写MVC程序,文本框和文本视图,按钮和标签,滑块、步进和图像,使用开关控件和分段控件,Web视图控件和可滚动视图控件,提醒和操作表,工具栏,日期选择器,表视图,活动指示器,进度条和检索条,UIView,视图控制器,实现多场景和弹出框,iPad弹出框和分割视图控制器,界面旋转,图形、图像、图层和动画,声音服务,多媒体应用,定位处理,触摸,手势识别和Force Touch,读写应用程序数据,触摸和手势识别,和硬件之间的操作,开发通用的项目程序,推服务和多线程,Touch ID,游戏开发,HealthKit健康应用开发,watchOS 4智能手表开发,分屏多任务,使用CocoaPods依赖管理,使用扩展(Extension),在程序中加入Siri功能,开发tvOS程序,开发Apple Pay程序,开发虚拟现实程序,分屏多视图播放器,tvOS电影库系统等高级知识。

    本书内容全面,几乎涵盖了iOS 11应用开发所需要的主要内容,适合iOS开发初学者和iOS程序员学习,也可以作为相关培训学校和高校相关专业的教学用书。

    小福利

    关注【异步社区】服务号,转发本文至朋友圈或 50 人以上微信群,截图发送至异步社区服务号后台,并在文章底下留言你的开发经验,或者试读本书感受,我们将选出3名读者赠送《iOS 11 开发指南》1本,赶快积极参与吧!
    活动截止时间:2018年4月8日

    ​在“异步社区”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!

    扫一扫上方二维码,回复“关注”参与活动!

    阅读原文,购买《iOS 11 开发指南》

    阅读原文

    展开全文
  • iOS11新特性之LargeTitle

    2019-01-06 13:26:29
    这种风格最明显的变化就是使用了iOS 11新特性--Large Title和新的SearchController。 Demo GitHub: LargerTitleDemo   Large Title &amp; Table View 设置Lager Title APP全局使用Large Title ...
  • iOS11新特性,如何适配iOS11

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

    万次阅读 2017-06-08 13:34:30
    首先说一下iOS 11,在WWDC发布之后我对iOS11上面带来的诸多新特性感觉很好想体验一下,并在第一时间更新了iOS11开发者预览版! 更新后体验一天后我的感想是卡卡卡卡,几乎任何一个反应,都有延迟,都要等,等得我好...
  • 苹果秋季发布会在软件方面,备受期待的莫过于 iOS 11,阅读本文,让我们一起一睹 iOS 11 的风采。
  • 输出错误信息: The resource could not be loaded because the App Transport Security policy requires the use of...iOS9引入了新特性App Transport Security (ATS)。 新特性要求App内访问的网络必须使用HTTPS协议。
  • iOS各个版本的特性和差别

    万次阅读 2018-04-03 11:22:34
    iOS不同版本升级的新特性:iOS3.0开发特性一、点对点蓝牙连接二、远程浏览内容三、连接周边产品(硬件)四、其它应用可以使用maps五、定位软件六、推送功能七、网络电话(voip)八、录音九、播放音乐十、增强了 app ...
  • 适配iOS9(ATS问题)

    万次阅读 2015-06-19 16:52:42
    前言今天下了XCode7 Beta版,跑了一下自家的APP,结果发现所有服务器请求都返回失败,明明网络正常,怎么会返回...于是乎一顿Google,原来是iOS9(XCode7的模拟器默认是iOS9)的新特性——ATS搞的鬼。简介ATS全称为App
  • iOS10 新特性适配Label显示不全问题

    千次阅读 2016-09-26 10:20:35
    iOS10字体随着手机系统的字体改变,当我们手机系统字体改变以后,我们的app的lable也会跟着一起变化; 系统更新之后,会发生一些改变,我们需要适配不同的机型,并且适配不同的系统,今天讲的一个小问题: Label...
  • 每年的WWDC大会都激动和紧张好一段时间。激动的是期待苹果的产品带来的那些黑科技,尤其今年的iPhone10周年纪念...一、导航栏在解释导航栏变化之前先解释一个iOS 11新特性:设置大标题,通过BOOL类型的prefersLarg
  • ios9 http请求报错

    万次阅读 2015-09-24 13:56:41
    ATS全称为App Transport Security,它是iOS9的一个新特性,旨在提高iOS设备与服务器交互的安全性。简单地说,ATS会阻止未注册的网络请求。你可以在info.plist文件中注册相应的host,这样该host的网络请求就不会被...
  • iOS判断系统版本号的四种方法

    万次阅读 2016-11-30 15:23:40
    代码中判断设备iOS系统版本号从而使用不同方法处理来适配的四种方法
  • XXXXXXXX requires a provisioning profile. Select a provisioning profile in the Target Editor. Code signing is required for product type 'Application' in SDK 'iOS...Xcode8.0 新特性之一,更新了Provisioning
  • ios的tableview中headerview会随着滑动黏在上方,直到的sectionheaderview出现并替换掉,这是个好的特性,但是在为了实现PM某些需求的时候,又不是很符合心意,在网上查了下,找到了其解决方法: // 去掉...
  • 将状态栏隐藏掉之后,页面上的tableView会自动向上滚20个像素 这是因为在iOS7.0之后,系统会自动调整scrollView的layout 和 contentInsets 。从而使其自动地适应iOS7之后那种整个屏幕都可以放入自定义控件的方法。...
  • iOS基础面试题(一)

    万次阅读 多人点赞 2016-03-23 18:19:35
    kaikaijia同学私信我,说想加群,我就建个iOS开发群,大家做技术交流和资源,群号:241048287,有兴趣的同学可以加群,验证信息:iOS+姓名。 iOS面试题系列: iOS面试题(二) iOS面试题(三) iOS面试题(四) 随着...
  • Swift 1.2新特性速通

    千人学习 2015-05-15 09:21:09
    只要10分钟, 小波让你轻松掌握新版语法! 助你始终走在Swift开发前沿!
1 2 3 4 5 ... 20
收藏数 101,415
精华内容 40,566
热门标签
关键字:

ios11新特性