Xcode11 缺失库文件导入位置变更
Xcode11下 这个目录不存在了
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
【变更为】
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
----以下位置不需要改变
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/
友盟相关 升级最新版本SDK
注册新浪平台 崩溃【验证:仅在模拟器上出现】
这个应该是需要微博官方进行适配了,尝试模拟了 getUniqueStrByUUID
中的相关写法。
屏幕快照2019-06-05下午1.47.08.png
- 暂时的解决方案:
//修复iOS13下 崩溃问题 验证为:模拟器下出现
#if TARGET_IPHONE_SIMULATOR
/// 交换方法实现
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(@available(iOS 13.0, *)){
Method origin = class_getClassMethod([UIDevice class], NSSelectorFromString(@"getUniqueStrByUUID"));
// IMP originImp = method_getImplementation(origin);
Method swizz = class_getClassMethod([self class], @selector(swizz_getUniqueStrByUUID));
//交换方法实现
method_exchangeImplementations(origin, swizz);
}
});
#pragma mark - 获取唯一标识 新浪
+ (NSString *)swizz_getUniqueStrByUUID{
CFUUIDRef uuidObj = CFUUIDCreate(nil);//create a new UUID
//get the string representation of the UUID
NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(nil, uuidObj);
CFRelease(uuidObj);
return uuidString ;
}
#endif
+[_LSDefaults sharedInstance] 崩溃问题
针对的友盟版本:
移动统计:6.0.5
消息推送:3.2.4
社会化分享:6.9.6
- 暂时的解决方案:
@implementation NSObject (Extend)
+ (void)load{
SEL originalSelector = @selector(doesNotRecognizeSelector:);
SEL swizzledSelector = @selector(sw_doesNotRecognizeSelector:);
Method originalMethod = class_getClassMethod(self, originalSelector);
Method swizzledMethod = class_getClassMethod(self, swizzledSelector);
if(class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))){
class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
}else{
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
+ (void)sw_doesNotRecognizeSelector:(SEL)aSelector{
//处理 _LSDefaults 崩溃问题
if([[self description] isEqualToString:@"_LSDefaults"] && (aSelector == @selector(sharedInstance))){
//冷处理...
return;
}
[self sw_doesNotRecognizeSelector:aSelector];
}
DeviceToken获取 友盟公告
#include <arpa/inet.h>
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
if (![deviceToken isKindOfClass:[NSData class]]) return;
const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSLog(@"deviceToken:%@",hexToken);
}
UITextField
通过KVC方式修改空白提示语颜色 崩溃
[UITextField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor”];
- 解决方案:
attributedPlaceholder
leftView、rightView 设置异常 【疑似iOS13beta4新出现】
在设置
leftView
左按钮时,如果使用的是UIImageView
即会出现图片无法按照意图显示的问题。
@騲尼罵人獣狂 反馈
UITextField
的rightView
的子视图如果使用约束布局
, 会导致rightView
覆盖整个UITextField
。
// Confuse in beta4 iOS13
UIImageView *imageIcon = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 34, 30)];
//search_icon 15*15
imageIcon.image = [UIImage imageNamed:@"search_icon"];
imageIcon.contentMode = UIViewContentModeCenter;
UITextField *txtSearch = [[UITextField alloc] init];
txtSearch.leftView = imageIcon;
- 解决方案:
UIImageVIew 包一层UIView再设置给leftView 、设置leftView或rightView不要使用约束布局
UISearchBar
验证来源:@騲尼罵人獣狂
searchTextField
属性对外暴露了,不用再通过KVC获取了。
UISearchBar *searchBar = [[UISearchBar alloc]init];
searchBar.searchTextField
控制器相关
模态跳转样式变更
过场动画上下文机制有调整,默认调整为了卡片样式。
/*
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.
*/
@property(nonatomic,assign) UIModalPresentationStyle modalPresentationStyle API_AVAILABLE(ios(3.2));
[nav setModalPresentationStyle:UIModalPresentationFullScreen];
模态横屏弹出
如果希望模态视图是以横屏状态弹出,需要注意到其会受到跳转样式的影响。
默认的卡片样式,仍然会以竖屏弹出。
- (BOOL)shouldAutorotate {
return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscapeRight;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeRight;
}
Dark Mode 颜色主题相关
UIColor 适配
UIColor *dynamicColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * provider) {
//使用 provider 判断,有时会出问题
if(keyWindow.isDark){
return darkColor;
}
return lightColor;
}];
YYTextView && YYLabel 适配 完美解决的前提是 UIColor 必须正确适配
如果你也在做该适配的话,那么很可能遇到以下的问题。
尝试了很多次,最大的问题竟出在UIColor
。
不过出现的问题,疑似和YY内部在Runloop 即将休眠时进行绘制任务具有很大的相关性。
具体原因还不能确定,等以后再深究一下。
系统表现
这里先看下系统UILabel的暗夜适配找寻一下灵感
UILabel DarkMode.png
可以看到,UILabel的绘制是调用 drawTextInRext
,而翻看YY能看到其使用的 CTRunDraw()
。由于一开始对UIDynamicProviderColor有误解,也尝试过解析其中打包的颜色,来通过查看CTRun的属性集来判断当前是否正确渲染。
....然而,在YYLabel应用上述方案时可能正常,但YYTeView却出现了其它的问题。
....排查中发现,某些时候UITraitCollection.currentTraitCollection
解析出的颜色,和对应的状态不符。
....最终发现,colorWithDynamicProvider
中回调的状态可能出现和当前系统状态不一致的情况,也就是说这个回调有点不那么可信了... 误我青春
YYLabel 适配
YYLabel.m 添加如下代码
#pragma mark - DarkMode Adapater
#ifdef __IPHONE_13_0
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
[super traitCollectionDidChange:previousTraitCollection];
if (@available(iOS 13.0, *)) {
if([UITraitCollection.currentTraitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]){
[self.layer setNeedsDisplay];
}
} else {
// Fallback on earlier versions
}
}
#endif
YYTextView 适配
YYTextView.m 添加如下代码
#pragma mark - Dark mode Adapter
#ifdef __IPHONE_13_0
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
[super traitCollectionDidChange:previousTraitCollection];
if (@available(iOS 13.0, *)) {
if([UITraitCollection.currentTraitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]){
[self _commitUpdate];
}
} else {
// Fallback on earlier versions
}
}
#endif
额外要做的事情
- NSAttributedString+YYText.m 去除部分CGColor 调用
- (void)setColor:(UIColor *)color {
[self setColor:color range:NSMakeRange(0, self.length)];
}
- (void)setStrokeColor:(UIColor *)strokeColor {
[self setStrokeColor:strokeColor range:NSMakeRange(0, self.length)];
}
- (void)setStrikethroughColor:(UIColor *)strikethroughColor {
[self setStrikethroughColor:strikethroughColor range:NSMakeRange(0, self.length)];
}
- (void)setUnderlineColor:(UIColor *)underlineColor {
[self setUnderlineColor:underlineColor range:NSMakeRange(0, self.length)];
}
UIImageView
主要发现两个问题:
1.初始化:UIImageView.image 初始化时必须设置,否则不显示 。
2.暗黑适配:图片经过拉伸处理后,会导致暗黑适配失效。
- @不羁觅觅羊 分享的解决方案:
#pragma mark - 解决Image拉伸问题
+ (UITraitCollection *)lightTrait API_AVAILABLE(ios(13.0)) {
static UITraitCollection *trait = nil;
static dispatch_once_t