以iOS15和xcode13为环境基础,iOS15适配的一些更改和调整。
UINavigationBar
UITabBar
TableView
Image
ProMotion
CLLocationButton
UINavigationBar
用新xcode13编译工程后,导航栏的问题比较明显,调试之后发现是UINavigationBar部分属性的设置在iOS15上是无效的
OC:
// 修改NarBar背景if(@available(iOS15.0,*)){UINavigationBarAppearance*appearance=[[UINavigationBarAppearance alloc]init];// 背景色appearance.backgroundColor=[UIColor blueColor];// 去掉半透明效果appearance.backgroundEffect=nil;// 标题字体颜色及大小appearance.titleTextAttributes=@{NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName:[UIFont boldSystemFontOfSize:18],};// 设置导航栏下边界分割线透明appearance.shadowImage=[[UIImage alloc]init];// 去除导航栏阴影(如果不设置clear,导航栏底下会有一条阴影线)appearance.shadowColor=[UIColor clearColor];// standardAppearance:常规状态, 标准外观,iOS15之后不设置的时候,导航栏背景透明self.navigationBar.standardAppearance=appearance;// scrollEdgeAppearance:被scrollview向下拉的状态, 滚动时外观,不设置的时候,使用标准外观self.navigationBar.scrollEdgeAppearance=appearance;}else{navigationBar.setBackgroundImage(UIColor.clear.image,for:.default)// 导航栏背景,主题色是绿色navigationBar.barTintColor=UIColor.theme// 默认不透明navigationBar.isTranslucent=false// 着色,让返回按钮图片渲染为白色navigationBar.tintColor=UIColor.white// 导航栏文字navigationBar.titleTextAttributes=[NSAttributedString.Key.font:UIFont.systemFont(ofSize:18),NSAttributedString.Key.foregroundColor:UIColor.white]}
Swift
if#available(iOS15,*){let app=UINavigationBarAppearance.init()app.configureWithOpaqueBackground()// 重置背景和阴影颜色app.titleTextAttributes=[NSAttributedString.Key.font:UIFont.systemFont(ofSize:18),NSAttributedString.Key.foregroundColor:UIColor.white]app.backgroundColor=UIColor.theme// 设置导航栏背景色app.shadowImage=UIColor.clear.image// 设置导航栏下边界分割线透明navigationBar.scrollEdgeAppearance=app// 带scroll滑动的页面navigationBar.standardAppearance=app// 常规页面}
UITabbar
tabbar的问题和navigationBar的问题属于同一类,tabbar背景颜色设置失效,字体设置失效,阴影设置失效问题。
OC
// 修改tabbar背景if(@available(iOS15.0,*)){UITabBarAppearance*appearance=[UITabBarAppearance new];//tabBar背景颜色appearance.backgroundColor=[UIColor whiteColor];// 去掉半透明效果appearance.backgroundEffect=nil;// tabBaritem title选中状态颜色appearance.stackedLayoutAppearance.selected.titleTextAttributes=@{NSForegroundColorAttributeName:KColorFromRGB(0x53A2F8),NSFontAttributeName:[UIFont systemFontOfSize:12],};//tabBaritem title未选中状态颜色appearance.stackedLayoutAppearance.normal.titleTextAttributes=@{NSForegroundColorAttributeName:KColorFromRGB(0x7E7E7E),NSFontAttributeName:[UIFont systemFontOfSize:12],};self.tabBar.scrollEdgeAppearance=appearance;self.tabBar.standardAppearance=appearance;}
Swift
if#available(iOS15,*){let bar=UITabBarAppearance.init()bar.backgroundColor=UIColor.white bar.shadowImage=UIColor.init(0xEEEEEE).image let selTitleAttr=[NSAttributedString.Key.font:itemFont,NSAttributedString.Key.foregroundColor:UIColor.theme]bar.stackedLayoutAppearance.selected.titleTextAttributes=selTitleAttr// 设置选中attributesself.tabBar.scrollEdgeAppearance=barself.tabBar.standardAppearance=bar}
UITableview
iOS15对于tableview,新增了sectionHeaderTopPadding作为列表每个部分标题上方的填充,它的默认值是UITableViewAutomaticDimension,所以我们要将他设置为0,否则当我们的列表设置了section高度的列表会出现head高度增加的情况,适配方式:
// OCif(@available(iOS15.0,*)){self.tableView.sectionHeaderTopPadding=0;}// Swiftif#available(iOS15,*){tableView.sectionHeaderTopPadding=0}
Image
在iOS15中,UIImageWriteToSavedPhotosAlbum存储图片之后的回调不再返回图片了,会返回nil,如果在回调方法里面操作image有可能会直接Crash,目前的解决办法声明一个全局image去记录,后面再去操作:
self.image=savedImage;UIImageWriteToSavedPhotosAlbum(savedImage,self,@selector(image:didFinishSavingWithError:contextInfo:),NULL);-(void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{// self.image doing...}
新增了几个调整尺寸的方法:
// preparingThumbnailUIImage(named:"sv.png")?.preparingThumbnail(of:CGSize(width:200,height:100))// prepareThumbnail,闭包中直接获取调整后的UIImageUIImage(named:"sv.png")?.prepareThumbnail(of:CGSize(width:200,height:100)){imagein// 需要回到主线程更新UI}awaitUIImage(named:"sv.png")?.byPreparingThumbnail(ofSize:CGSize(width:100,height:100))
系统图片支持多个层,支持多种渲染模式:
// preparingThumbnailUIImage(named:"sv.png")?.preparingThumbnail(of:CGSize(width:200,height:100))// prepareThumbnail,闭包中直接获取调整后的UIImageUIImage(named:"sv.png")?.prepareThumbnail(of:CGSize(width:200,height:100)){imagein// 需要回到主线程更新UI}awaitUIImage(named:"sv.png")?.byPreparingThumbnail(ofSize:CGSize(width:100,height:100))
ProMotion设备配置高刷权限
iPhone 13 Pro、iPhone 13 Pro Max 和 iPad ProMotion 显示器能够在以下各项之间动态切换:
刷新率高达 120Hz,低至 24Hz 或 10Hz 的较慢刷新率。
目前在iPhone 13 Pro 或 iPhone 13 Pro Max 上非官方APP默认不支持120Hz刷新率,其实只需要在Plist上配置以下权限,就可以使用上高刷,而Pad Pro 不需要这种特殊配置,默认支持高刷。
<key>CADisableMinimumFrameDurationOnPhone</key><true/>
CLLocationButton
该内容内置于CoreLocationUI模块,但如果需要获取定位的详细信息仍然需要借助于CoreLocation。
let locationButton=CLLocationButton()// 文字locationButton.label=.currentLocationlocationButton.fontSize=20// 图标locationButton.icon=.arrowFilled// 圆角locationButton.cornerRadius=10// tintlocationButton.tintColor=UIColor.systemPink// 背景色locationButton.backgroundColor=UIColor.systemGreen// 点击事件,应该在在其中发起定位请求locationButton.addTarget(self,action:#selector(getCurrentLocation),for:.touchUpInside)
仅做记录用,转自:https://www.jianshu.com/p/47df8b769f7f