iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)

Posted iOS开发攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)相关的知识,希望对你有一定的参考价值。

1.编译报错

因为我的项目是 OC+Swift 混编的,升级 Xcode9后就直接报这个编译错误


意思是项目里 Swift  DeBug 模式的问题,一开始我试试把 编译模式直接从 DEBug 切换到 release 模式,发现还真的可以,但是想了一下,不可能以后一直 release 模式编译吧, 后来检索了一下

Build Settings -> Other Swift Flags. 

发现里面有一个选项,设置的可能存在问题 DEBUG ,不能用了,果断删除

 iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)

成功 FIX

2.Swift 第三方库报错          

这边,如果是 swift3.2的就没有问题

但是,如果是比较旧的就可能挂逼了.

因为,目前大部分第三方也不会那么快适配完 Swift4,所以我们可以先用 Swift3.2的用着(毕竟项目安全可编译才是第一考虑的),这边我是选择 使用 Cocopods 处理的

platform :ios, '8.0'

post_install do |installer|

    # 需要指定编译版本的第三方的名称

    myTargets = ['ObjectMapper', 'SnapKit','SwiftyJSON','HandyJSON','Alamofire']

   

    installer.pods_project.targets.each do |target|

        if myTargets.include? target.name

            target.build_configurations.each do |config|

                config.build_settings['SWIFT_VERSION'] = '3.2'

            end

        end

    end

end

use_frameworks!

值此国庆及中秋佳节来临之际,我谨代表全体适配的不要不要的 iOS 码农感谢Cocopods!


3.iOS 11适配  TableView 莫名其妙上移

我们知道 iOS11对 tableView 和 ScorllView 做了更新

但是, 首先设置一下,我们的 frame 从导航栏下开始计算

    self.edgesForExtendedLayout = UIRectEdgeNone; //默认布局从导航栏下开始

然后, 由于 iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

我们进去查看一下 API

 */

@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));

/* contentLayoutGuide anchors (e.g., contentLayoutGuide.centerXAnchor, etc.) refer to the untranslated content area of the scroll view.

 */

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));

如果发现界面无意中位置偏移了,很可能是这个属性导致的。

解决方法

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

        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, NavgationBarH, 0);

        self.tableView.scrollIndicatorInsets = self.tableView.contentInset;

    } else {

        self.tableView.contentInset = UIEdgeInsetsMake(5, 0, 0, 0);

        self.automaticallyAdjustsScrollViewInsets = NO;

    }

  

    4.下拉刷新异常

自己项目代码有些界面,下拉刷新还原后出现了,向下偏移的问题,上网搜索了大部分是使用 MJRefresh(然而我并没有用那个,也一样出现了,自己项目的图就懒得截屏了...)

iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)

先说下解决方法

    self.tableView.estimatedRowHeight =0;

    self.tableView.estimatedSectionHeaderHeight =0;

    self.tableView.estimatedSectionFooterHeight =0;

简单粗暴

再进去查看一下 API 

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

原因是,现在 iOS11默认开启了,预估行高,还是UITableViewAutomaticDimension,

然而, iOS 11以前都是0.

关闭后.....下拉刷新完美如初.真棒.

5.适配 iphoneX  

首先启动页如果选择的是LaunchScreen.storyboard 的就基本还好(苹果爸爸已经做好了一部分),但是使用LaunchImage的就需要添加 iPhone X 格式的启动图片了,这边建议,已经 iOS 11了,大家就不要用老的LaunchImage了吧,赶紧换LaunchScreen.storyboard,还能省启动页图片,毕竟很多张还是很占体积的.

其次关于iPhone X刘海 ,Swift 有个简单的工具类iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)

pod 'HairPowder'

使用方法如下

import UIKit

import HairPowder

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

HairPowder.instance.spread() 

return true 

}

6.Xcode9下相册等访问权限问题

查了资料说iOS11下,苹果对相册的权限key做了调整,原来的 NSPhotoLibraryUsageDescription ,在iOS11之后,改成了 NSPhotoLibraryAddUsageDescription 。

针对于此测试了一下应用,果然毫无悬念, 立即去 info.plist 把 key 改成NSPhotoLibraryAddUsageDescription, 很快解决问题了.

图3: info.plist内设置NSPhotoLibraryAddUsageDescription权限

iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)

7.准备一下新的宏定义     

/*****宏定义 *****/

#define isIPhoneX ([UIScreen mainScreen].bounds.size.width == 375 && [UIScreen mainScreen].bounds.size.height == 812)

//导航栏高度

#define  NavBarHeight  isIPhoneX ? 88 : 64

//底部Tabbar 高度

#define TabBarHeight  isIPhoneX ? 83 : 49

//状态栏高度

#define  StatusBarHeight  isIPhoneX ? 44 : 20



建议有时间可以看看官方 WWDC2017视频(有中文字幕)(点击原文可看)





以上是关于iOS11+Xcode9适配踩坑大全(下拉刷新,编译错误, Swift第三方等)的主要内容,如果未能解决你的问题,请参考以下文章

iOS11&iPhoneX适配&Xcode9打包注意事项

iOS11及Xcode9适配问题汇总

iOS----------适配iOS12

详解iOS11iPhone XXcode9 适配指南

iOS11iPhone XXcode9 适配指南

iOS之iOS11iPhone XXcode9 适配指南