随着iPhone 11的发布,iOS 13适配也提上了日程,接下来就开发中升级iOS13的手机可能出现的问题
Xcode: 11.0
iOS : 13.0
UIViewController 模态弹出界面
viewController.present(presentVC, animated: true, completion: nil)
在调用模态弹出视图,会发现弹出的界面没有全屏。如图
通过多次的尝试,发现在低版本里面不会发生这种情况(iOS12及以下),于是我查阅了最新的开发文档,发现了端倪,主要还是因为我们之前忽略了UIViewController里面的一个属性,即:modalPresentationStyle
Defines the presentation style that will be used for this view controller when it is presented modally. Set this property on the view controller to be presented, not the presenter. If this property has been set to UIModalPresentationAutomatic, reading it will always return a concrete presentation style. By default UIViewController resolves UIModalPresentationAutomatic to UIModalPresentationPageSheet, but other system-provided view 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: 'Access 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的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,解决办法是修改为通过UITabBarButton的位置来设置红点的frame
App启动过程中,部分View可能无法实时获取到frame
// 只有等执行完 UIViewController 的 viewDidAppear 方法以后,才能获取到正确的值,在viewDidLoad等地方 frame Size 为 0,例如: UIApplication.shared.statusBarFrame
废弃UIWebView
查看API可以看到:iOS 2.0 到 iOS 11.0
在12.0就已经被废弃,部分APP使用webview时, 审核被拒
@available(iOS, introduced: 2.0, deprecated: 12.0, message: "No longer supported; please adopt WKWebView.") open class UIWebView : UIView, NSCoding, UIScrollViewDelegate { ......... ......... ......... }
CNCopyCurrentNetworkInfo
iOS13 以后只有开启了 Access WiFi Information capability,才能获取到 SSID 和 BSSID wi-fi or wlan 相关使用变更
最近收到了苹果的邮件,说获取WiFi SSID的接口CNCopyCurrentNetworkInfo 不再返回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 *wifiName = nil; CFArrayRef wifiInterfaces = CNCopySupportedInterfaces(); if (!wifiInterfaces) { return nil; } NSArray *interfaces = (__bridge NSArray *)wifiInterfaces; for (NSString *interfaceName in interfaces) { CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName)); if (dictRef) { NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef; NSLog(@"network info -> %@", networkInfo); wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID]; CFRelease(dictRef); } } CFRelease(wifiInterfaces); return wifiName; }
同意打印:如下
network info -> { BSSID = "44:dd:fb:43:91:ff"; SSID = "Asus_c039"; SSIDDATA = <41737573 5f633033 39>; } 不同意 network info -> { BSSID = "00:00:00:00:00:00"; SSID = WLAN; SSIDDATA = <574c414e>; }
持续更新中…
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍iOS13即将到来,iOS推送DeviceToken适配方案详解,包括了iOS13即将到来,iOS推送DeviceToken适配方案详解的使用技巧和注意事项,需要的朋友参考一下 随着苹果iOS13系统即将发布,个推提前推出DeviceToken适配方案,以确保新版本的兼容与APP推送服务的正常使用。iOS13的一个重要变化是"[deviceToken description]" 会受
本文向大家介绍Android状态栏的适配汇总,包括了Android状态栏的适配汇总的使用技巧和注意事项,需要的朋友参考一下 1.要求状态栏透明,我们的内容布局延伸到系统状态栏,就是人们口中说的沉浸式状态栏: Android 5.0 及其以后版本:设置属性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 使得我们的内容布局可以延伸到系统状态栏,然后直接使用方法 setSt
本文向大家介绍iOS10 Xcode8适配7个常见问题汇总,包括了iOS10 Xcode8适配7个常见问题汇总的使用技巧和注意事项,需要的朋友参考一下 iOS10 Xcode8问题汇总 【1】、Xcode8代码出现ubsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, def
本文向大家介绍iOS13适配深色模式(Dark Mode)的实现,包括了iOS13适配深色模式(Dark Mode)的实现的使用技巧和注意事项,需要的朋友参考一下 好像大概也许是一年前, Mac OS系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的 终于, 随着iPhone11等新手机的发售, iOS 13系统也正式发布了, 伴随着手机版的深色模式也出现在了大众视野 我们这些iOS程
我有用React编写的自定义组件库(汇总构建)。我不想在外部项目中使用creategbloalstyle BCS它的性能不佳。我添加了带有font-face(相对路径)的CSS文件,但这些字体在外部项目中不起作用。你知道如何修复它吗?src > 指数css带 @字体{字体系列:“font1”;字体显示:交换;字体重量:900;src:url(assets/font1/heavy/heavy.wof
主要内容:基本配置,主从服务配置,安全配置,限制配置,AOF日志模式,慢查询配置,服务端命令,客户端命令,连接命令本节对 Redis 的常用配置项和基本命令做简单的总结,您可以把本篇文章看做简版的速查手册。不过,需要注意的是由于 Redis 不同版本的差异,配置项会多少存在一些不同,但总体的来说,大同小异。 基本配置 主从服务配置 安全配置 限制配置 AOF日志模式 慢查询配置 Redis slowlog 是一个记录 Redis 执行查询命令时所耗费时间的日志系统,它仅记录执行一个查询命令所耗费