iOS11和Xcode9踩坑记录

tableview

headerView/footerView

问题描述:

只实现tableView:heightForFooterInSection:tableView:heightForHeaderInSection:方法返回section的header/footer高度时header/footer会使用默认值,如下图,只返回了footer的高度,没有返回footer的对象。

解决方法(2种):

  • 需要控制header/footer的高度还需要实现
    tableView:viewForHeaderInSection:tableView:viewForFooterInSection:方法。如图,即使是返回nil也会使高度设置生效
  • 通过将tableview新增的estimatedSectionHeaderHeightestimatedSectionFooterHeight属性设置为0,如下图
    iOS11-and-xcode9-adapt-02

BarButtonItem

设置负width失效

问题描述:

像往常一样,创建了两个barButtonItem,一个作为按钮,一个作为调整宽度的,将width设置为了-10,但是Xcode9编译运行后,并不是想要的按钮的位置向右缩减了10,如图:

iOS11-and-xcode9-adapt-03

但是在设置其width>0是会生效的

解决方法:

创建一个UIButton并设置其title/imageEdgeInsets,然后通过customView创建UIBarButtonItem。

iOS11-and-xcode9-adapt-04

设定了样式后点击样式

问题描述:

在Xcode9之前,通过-setTitleTextAttributes:forState:方式设定UIBarButtonItem的样式,只需要设定UIControlStateNormal的时候即可同时让其他状态也会使用相同的样式,而Xcode9只会设置Normal的样式,在按下高亮时还是默认的样式。
iOS11-and-xcode9-adapt-05

解决方法(2种):

  • 同样给UIControlStateHighlighted状态设定一下样式。
    iOS11-and-xcode9-adapt-06

  • 或者将UIBarButtonItem使用UIButton作为customView创建,UIButton没有出现这个问题。
    iOS11-and-xcode9-adapt-07

ToolBar上Item点击失效

问题描述:

  1. 创建一个全屏的半透明View并在这个View上放置一个tapGesture
  2. 创建一个toolBar放在这个View上
  3. 通过-initWithTitle:target:action:方法创建一个UIBarButtonItem放置在toolbar上
  4. 点击这个UIBarButtonItem,发现其有高亮状态但是点击被tapGesture响应
    问题仅在Xcode9+iOS11上出现。Xcode8+iOS11Xcode9+iOS10无法复现,大致样式如下图
    iOS11-and-xcode9-adapt-08

解决方法(2种):

个人更倾向于第二种

  • 再创建一个View放置在上半截位置上,然后将tapGesture添加给这个只有半截的View上
  • 将UIBarButtonItem的初始化方法改为通过customView初始化,使用UIButton作为customView

App图标丢失

问题描述:

使用Xcode9+CocoaPods的工程在编译运行后,会出现AppIcon丢失的问题

解决方法:

参考CocoaPods-Issue7003的方法,但是issues里建议的脚本在我这边运行会报错找不到:
iOS11-and-xcode9-adapt-09-0

后通过翻查Podfile-syntax以及ruby-pod-AggregateTarget找到其属性client_root可以获取项目路径,最终结合Issue7003里的脚本,插入到Podfile中,执行pod install后,即可

1
2
3
4
5
6
7
8
9
10
11
post_install do |installer|
installer.aggregate_targets.each do |target|
copy_pods_resources_path = "#{target.client_root}/Pods/Target Support Files/#{target.name}/#{target.name}-resources.sh"
string_to_replace = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"'
assets_compile_with_app_icon_arguments = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_
APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"'
text = File.read(copy_pods_resources_path)
new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments)
File.open(copy_pods_resources_path, "w") {|file| file.puts new_contents }
end
end

部分宏定义失效

问题描述:

我们使用的一个库中check_compile_time()报错,如下图:

iOS11-and-xcode9-adapt-10

排查过程:

但是使用Xcode9无法跳转其定义,使用Xcode8跳转后发现其实际是__Check_Compile_Time(),如下图:

iOS11-and-xcode9-adapt-11

然后再回到Xcode9改为了__Check_Compile_Time()后点击跳转定义文件里发现,提示一些原来的宏被更改名称为__开头了:

iOS11-and-xcode9-adapt-12

解决方法:

将上图中提示的相关的宏定义替换成新的即可