iOS 13适配汇总(推荐)
随着iPhone 11的发布,iOS 13适配也提上了日程,接下来就开发中升级iOS13的手机可能出现的问题
Xcode: 11.0
iOS : 13.0
UIVieController 模态弹出界面
vieController.present(presentVC, animated: true, pletion: nil)
在调用模态弹出视图,会发现弹出的界面没有全屏。如图
通过多次的尝试,发现在低版本里面不会发生这种情况(iOS12及以下),于是我查阅了最新的开发文档,发现了端倪,主要还是因为我们之前忽略了UIVieController里面的一个属性,即:modalPresentationStyle
Defines the presentation style that ill be used for this vie controller hen it is presented modally. Set this property on the vie controller to be presented, not the presenter. If this property has been set to UIModalPresentationAutomatic, reading it ill alays return a concrete presentation style. By default UIVieController resolves UIModalPresentationAutomatic to UIModalPresentationPageSheet, but other system-provided vie controllers may resolve UIModalPresentationAutomatic to other concrete presentation styles. Defaults to UIModalPresentationAutomatic on iOS starting in iOS 13.0, and UIModalPresentationFullScreen on previous versions. Defaults to UIModalPresentationFullScreen on all other platforms. public enum UIModalPresentationStyle : Int { case fullScreen @available(iOS 3.2, ) case pageSheet @available(iOS 3.2, ) case formSheet @available(iOS 3.2, ) case currentContext @available(iOS 7.0, ) case custom @available(iOS 8.0, ) case overFullScreen @available(iOS 8.0, ) case overCurrentContext @available(iOS 8.0, ) case popover @available(iOS 7.0, ) case none @available(iOS 13.0, ) case automatic }
通过查看API 可以看到,iOS 13 新增一个automatic类型,默认情况下就是这个所以才会弹出不是全屏的界面。如果我们想要修改为全屏的话
可以presentVC.modalPresentationStyle = .fullScreen设置为全屏即可
KVC 限制
iOS13以后已经不能肆无忌惮的通过 KVC来修改一些没有暴露出来的属性了。
Terminating app due to uncaught exception 'NSGenericException', reason: 'Aess to xxx's _xxx ivar is prohibited. This is an application bug'
我们常用的有
// UITextField 的 _placeholderLabel let textField = UITextField.init() textField.setValue(UIColor.red, forKey: "_placeholderLabel.textColor") /// UISearchBar 的 _searchField [searchBar valueForKey:@"_searchField"]
下面方法替换
///分别设置字体大小和颜色(富文本) textField.attributedPlaceholder = NSAttributedString.init(string: "请输入....", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red], [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)]) /// UISearchBar 用 searchField代替 bar.value(forKey: "searchField") as! UITextField
UISegmentedControl 默认样式改变
默认样式变为白底黑字,如果设置修改过颜色的话,页面需要修改
UITabbar
如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton的subVies发现只有在TabBar选中状态下才能取到UITabBarSappableImageVie,解决方法是修改为通过UITabBarButton的位置来设置红点的frame
App启动过程中,部分Vie可能无法实时获取到frame
// 只有等执行完 UIVieController 的 vieDidAppear 方法以后,才能获取到正确的值,在vieDidLoad等地方 frame Size 为 0,例如 UIApplication.shared.statusBarframe
废弃UIWebVie
查看API可以看到iOS 2.0 到 iOS 11.0
在12.0就已经被废弃,部分APP使用ebvie时, 审核被拒
@available(iOS, introduced: 2.0, deprecated: 12.0, message: "No longer supported; please adopt WKWebVie.") open class UIWebVie : UIVie, NSCoding, UIScrollVieDelegate { ......... ......... ......... }
CNCopyCurrentNetorkInfo
iOS13 以后只有开启了 Aess WiFi Information capability,才能获取到 SSID 和 BSSID i-fi or lan 相关使用变更
最近收到了苹果的邮件,说获取WiFi SSID的接口CNCopyCurrentNetorkInfo 不再返回SSID的值。不仔细看还真会被吓一跳,对物联网的相关APP简直是炸弹。仔细看邮件还好说明了可以先获取用户位置权限才能返回SSID。
注意目本身已经打开位置权限,则可以直接获取
- (NSString) getWifiSsid { if (@available(iOS 13.0, )) { //用户明确拒绝,可以弹窗提示用户到设置中手动打开权限 if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { NSLog(@"User has explicitly denied authorization for this application, or location services are disabled in Settings."); //使用下面接口可以打开当前应用的设置页面 //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; return nil; } CLLocationManager cllocation = [[CLLocationManager alloc] init]; if(![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){ //弹框提示用户是否开启位置权限 [cllocation requestWhenInUseAuthorization]; usleep(50); //递归等待用户选选择 return [self getWifiSsidWithCallback:callback]; } } NSString ifiName = nil; CFArrayRef ifiInterfaces = CNCopySupportedInterfaces(); if (!ifiInterfaces) { return nil; } NSArray interfaces = (__bridge NSArray )ifiInterfaces; for (NSString interfaceName in interfaces) { CFDictionaryRef dictRef = CNCopyCurrentNetorkInfo((__bridge CFStringRef)(interfaceName)); if (dictRef) { NSDictionary orkInfo = (__bridge NSDictionary )dictRef; NSLog(@"ork info -> %@", orkInfo); ifiName = [orkInfo objectForKey:(__bridge NSString )kCNNetorkInfoKeySSID]; CFRelease(dictRef); } } CFRelease(ifiInterfaces); return ifiName; }
同意打印如下
ork info -> { BSSID = "44:dd:fb:43:91:ff"; SSID = "Asus_c039"; SSIDDATA = <41737573 5f633033 39>; } 不同意 ork info -> { BSSID = "00:00:00:00:00:00"; SSID = WLAN; SSIDDATA = <574c414e>; }
持续更新中…
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线