iOS11&iPhoneX适配笔记

一、iPhone设备变迁

15款iphone、5种不同比例的屏幕

3GS、3G: 320*480     @1x 320*480像素分辨率            3.5英寸
4S、4、       320*480     @2x 640*960像素分辨率            3.5英寸
SE、5S、5C、5: 320*568     @2x     640*1136像素分辨率           4.0英寸
8、7、6S、6:   375*667     @2x 750*1334像素分辨率           4.7英寸

8P、7P、6SP、6P:   414*736     @3x     1080*1920(1.15)像素分辨率    5.5英寸
8X:     375*812     @3x     1125*2436像素分辨率      5.8英寸

预装系统;https://baike.baidu.com/item/iPhone/238239

1       ios1    07
3g/2g       ios2    08
3gs     ios3    09  
4       ios4    10


4s      ios5    11
5       ios6    12
5s,5c       ios7    13
6,6p        ios8    14
6s,6sp,se   ios9    15
7,7p        ios10   16
8,8p,8x     ios11   17  

支持的模拟器,4s,5,5c,5s,6,6p 最低版本都是从iOS 8.0开始;
6s,6sp, se 最低从iOS 9.0开始;
7,7p 最低从iOS 10.0开始;
8,8p,8x最低从iOS 11.0开始。

375*667         SafeArea     
375*812         SafeArea

带标签栏 : 812- 44-49-34=685
带导航栏: 812-44-44-49-34=641

44导航栏,
49标签栏,

34底部空白,
44(32+12)顶部空白

二、编译器xcode 9 带来的变化

1,无线调试

2,代码块提示。 鼠标移到for上按下command键
对class, func, if, for都有效。

3,command+control再点击,快速跳转到定义。

4、command+点击,弹出菜单
跳转到定义
显示了快速帮助
scope
重命名

5、New Color Set
Assets.xcassets加入有名字的颜色。
使用IB构建UI可以享受到这一个福利

6、  Debug View Hierarchy
xcode8只能看到controller的view
xcode9可以看到controller

7、 Xcode 9 上面区分了 Group 和 Folder,所以也提供了 Create Group without Folder。
并且 Group 的图标是有个角的, 原来的关联的虚拟的group,如果没有对应绝对路径的文件夹,则会显示红色的。

三、iOS11系统 带来的变化

1, Navigation title 放大了导航栏的标题字体
// 设置为true:self.navigationItem.largeTitleDisplayMode设置,显示大标题模式,也可以显示小标题模式。
// 设置为false:self.navigationItem.largeTitleDisplayMode设置大标题不起作用。

self.navigationController.navigationBar.prefersLargeTitles =true;
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;

提供了一套类似Files App的界面。可以获取用户设备上的,或者云端的文件。

FileProvider
FileProviderUI

3.不再支持32位APP: 意思是说32位Only的APP在iOS 11上跑不起来。这在iOS 10上是可以的。
64位系统,跑32位软件: iOS11不可以,iOS10和以下可以。
32位系统,跑64位软件:不能。

真机架构.a
armv7(32位): 3gs,4,4s
armv7s(32位): 5,5c

arm64(64位): 5s和以上

模拟器架构.a
i386(32位):4,4s,5,5c
x86_64(64位):5s和以上

4、增加DeviceCheckAPI。追踪用户。
你在设备上用 DeviceCheck API 生成一个 token,然后将这个 token 发给自己的服务器,再由自己的服务器与 Apple 的 API 进行通讯,来更新或者查询该设备的值。这两个 bit 的数据用来追踪用户比如是否已经领取奖励这类信息。

5、PDfkit显示和操作PDF文件。

6、
IdentityLookup - 可以自己开发一个 app extension 来拦截系统 SMS 和 MMS 的信息。系统的信息 app 在接到未知的人的短信时,会询问所有开启的过滤扩展,如果扩展表示该消息应当被拦截,那么这则信息将不会传递给你。扩展有机会访问到事先指定的 server 来进行判断 (所以说你可以光明正大地获取用户短信内容了,不过当然考虑到隐私,这些访问都是匿名加密的,Apple 也禁止这类扩展在 container 里进行写入)。

只能读信息,不能篡改信息。

7、iPhone7/7Plus上提供CoreNFC支持。
上提供基础的近场通讯读取功能。看起来很 promising,只要你有合适的 NFC 标签,手机就可以进行读取。但是考虑到无法后台常驻,实用性就打了折扣。

8、AutoFill
从 iCloud Keychain 中获取密码,然后自动填充的功能现在开放给第三方开发者了。UITextInputTraits 的 textContentType 中添加了 username 和 password,对适合的 text view 或者 text field 的 content type 进行配置,并填写 Info.plist 的相关内容,就可以在要求输入用户名密码时获取键盘上方的自动填充,帮助用户快速登录。

9、增加系统条件@available

    if (@available(iOS 10.3, *)) {
  10.3的API
    } else {
10.3系统一下的API
    }


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


} else {

}

10、增加了AutoLayout增加了约束条件。

image.png
iOS11&iPhoneX适配笔记_第1张图片
image.png

四、具体遇到的适配问题

1、iOS11中AppIcon设置无效的问题

https://github.com/mythkiven/developTips
据说是Cocopods的问题。 如果不用Cocoapods确实可以。增加1024图片即可。
直接在InfoPlist中配也可以有效

iOS11&iPhoneX适配笔记_第2张图片
image.png
CFBundleIcons
    
        CFBundlePrimaryIcon
        
            UIPrerenderedIcon
            
            CFBundleIconFiles
            
                1024x1024.png
                [email protected]
                [email protected]
                [email protected]
                [email protected]
                [email protected]
                [email protected]
                [email protected]
                [email protected]
            
        
        CFBundleAlternateIcons
        
            1
            
                UIPrerenderedIcon
                
                CFBundleIconFiles
                
                    icon22.png
                    [email protected]
                    [email protected]
                
            
        
    

2, 导航条按钮问题

UIBarButtonSystemItemFixedSpace不管用了? 还是默认的左边缘距离值修改了。

3、导航条大标题模式

大标题模式

(0 20; 375 96) UINavigationBar
(0 -20; 375 116) _UIBarBackground
(0 44; 375 52) _UINavigationBarLargeTitleView
(0 0; 375 44) _UINavigationBarContentView

小标题模式

(0 20; 375 44) UINavigationBar
(0 -20; 375 64) _UIBarBackground
(0 0; 375 44) _UINavigationBarContentView

// 设置为true:self.navigationItem.largeTitleDisplayMode设置,显示大标题模式,也可以显示小标题模式。
// 设置为false:self.navigationItem.largeTitleDisplayMode设置大标题不起作用。

    self.navigationController.navigationBar.prefersLargeTitles =true;
    //
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;

总结:
8x: 导航栏88+搜索框(如果有)52
8:导航栏64+搜索框(如果有)52

大标题:
8x: 导航栏140(大标题52)+搜索框(如果有)52
8:导航栏116(大标题52)+搜索框(如果有)52

5、 设置导航栏搜索控制器 searchController

UILayoutContainerView
    UINaivgationTransitionView
        UIViewContollerWrapperView
    _UINavigationControllerPaletteClippingView//搜索框
    UINavigationBar//导航条


大标题模式:
(0 0; 375 667);     _UINavigationControllerPaletteClippingView
 (0 116; 375 52)        _UINavigationControllerManagedSearchPalette
(0 0; 375 52)               _UIBarBackground
(0 0; 375 52);              UISearchBar

小标题模式:
(0 0; 375 667);     _UINavigationControllerPaletteClippingView
(0 64; 375 52)          _UINavigationControllerManagedSearchPalette
(0 0; 375 52)               _UIBarBackground
(0 0; 375 52);              UISearchBar

激活状态下:
搜索框:
(0 0; 375 667);     _UINavigationControllerPaletteClippingView
 (0 20; 375 50)         _UINavigationControllerManagedSearchPalette
(0 -20; 375 70);            _UIBarBackground
 (0 0; 375 50);             UISearchBar

导航条:

(0 -96; 375 96);    UINavigationBar
 (0 -20; 375 116)       _UIBarBackground
(0 44; 375 52)          _UINavigationBarLargeTitleView
 (0 0; 375 44)          _UINavigationBarContentView

总结:
激活时:搜索框116高度。移到顶部。导航条移到父view的外面。

4、scrollView顶部20像素空白问题

这篇文章总结的是最好的。https://mp.weixin.qq.com/s/W1_0VrchCO50owhJNmJnuQ

//UIScrollView 
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));
@property(nonatomic, readonly) UIEdgeInsets adjustedContentInset API_AVAILABLE(ios(11.0),tvos(11.0));


//UITableView
@property (nonatomic) BOOL insetsContentViewsToSafeArea API_AVAILABLE(ios(11.0), tvos(11.0)); // default value is YES


//UIViewController
@property(nonatomic) UIEdgeInsets additionalSafeAreaInsets API_AVAILABLE(ios(11.0), tvos(11.0));
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES


//UIView
@property (nonatomic,readonly) UIEdgeInsets safeAreaInsets API_AVAILABLE(ios(11.0),tvos(11.0));
- (void)safeAreaInsetsDidChange API_AVAILABLE(ios(11.0),tvos(11.0));


UIViewContoller的automaticallyAdjustsScrollViewInsets过期,
改用UIScorllView的属性 contentInsetAdjustmentBehavior来控制。

修改contentInsetAdjustmentBehavior, 对应为变化adjustedContentInset值。

UIScrollView/UITableView/UICollectionView

1)、contentInset不会占用contentSize

2)、adjustedContentInset会导致ScrollView的contentOffset做对应的值偏移

3)、inset不会改变ContentView的Frame的Orgin

真正的边距由adjustedContentInset值决定

adjustedContentInset等于SafeAreaInsets和ContentInset两个合并加成,形成真正的边距。

5、 SafeArea布局。 9.0以上才可以用。
Safe Area Layout Guide before iOS 9.0
Safe Area Layout Guides

// UIViewController
@property(nonatomic,readonly,strong) id topLayoutGuide API_DEPRECATED_WITH_REPLACEMENT("-[UIView safeAreaLayoutGuide]", ios(7.0,11.0), tvos(7.0,11.0));
@property(nonatomic,readonly,strong) id bottomLayoutGuide API_DEPRECATED_WITH_REPLACEMENT("-[UIView safeAreaLayoutGuide]", ios(7.0,11.0), tvos(7.0,11.0));


//UIView
@property(nonatomic,readonly,strong) UILayoutGuide *safeAreaLayoutGuide API_AVAILABLE(ios(11.0),tvos(11.0));
@property(nonatomic,readonly,strong) UILayoutGuide *safeAreaLayoutGuide API_AVAILABLE(ios(11.0),tvos(11.0));

@property(readonly,strong) UILayoutGuide *layoutMarginsGuide NS_AVAILABLE_IOS(9_0);
@property (nonatomic, readonly, strong) UILayoutGuide *readableContentGuide  NS_AVAILABLE_IOS(9_0);

@property (nonatomic) BOOL insetsLayoutMarginsFromSafeArea API_AVAILABLE(ios(11.0),tvos(11.0));  // Default: YES

6、
UITableView
UITableViewDataSourcePrefetching---prefetchRowsAtIndexPaths
UITableViewDragDelegate、UITableViewDropDelegate

UIScrollView:
XIB的ContentInset对iOS11有效。

7、8x屏幕并没有全屏的问题
在Contents.json增加
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "[email protected]",
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
}

增加一张1125*2436的启动图片。

你可能感兴趣的:(iOS11&iPhoneX适配笔记)