iOS14适配
UIDatePicker 样式默认改变
xcode12 UIDatePicker 需要加入 preferredDatePickerStyle ,并且DatePickerMode必须在UIDatePicker的frame赋值前赋值
//用先前滚动的样式,然后设置frame
if (@available(iOS 13.4, *)) {
[_datePicker setPreferredDatePickerStyle:UIDatePickerStyleWheels];
} else {
}
_datePicker.frame = CGRectMake(0, kTopViewHeight + 0.5, SCREEN_WIDTH, kDatePicHeight);
UITableViewCell(解决:[self addSubview:] 改[self.contentView addSubview:])
在 iOS14 中,UITableViewCell 中如果有直接添加在 cell 上的控件,也就是使用 [self addSubview:] 方式添加的控件,会显示在 contentView 的下层。
contentView 会阻挡事件交互,使所有事件都响应 tableView:didSelectRowAtIndexPath: 方法,如果 customView 存在交互事件将无法响应。如果 contentView 设置了背景色,还会影响界面显示。
相册相关
1、iOS14 新增了“Limited Photo Library Access” 模式,在授权弹窗中增加了 Select Photo 选项。用户可以在 App 请求调用相册时选择部分照片让 App 读取。从 App 的视⻆来看,你的相册里就只有这几张照片,App 无法得知其它照片的存在。
需要在 Info.plist 中设置 “PHPhotoLibraryPreventAutomaticLimitedAccessAlert”的值为 YES 来阻止该弹窗反复弹出,并且可通过下面这个 API 来主动控制何时弹出PHPickerViewController 进行照片选择。
[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
2、 在 iOS14 中官方推荐使用 PHPicker 来替代原 API 进行图片选择。PHPicker 为独立进程,会在视图最顶层进行展示,应用内无法对其进行截图也无法直接访问到其内的数据。
需要 由 UIImagePickerController 替换到 PHPickerViewController, UIImagePickerViewController 功能受限,每次只能选择一张图片,将逐渐被废弃。 PHPicker 支持多选,支持搜索,支持按 image,video,livePhotos 等进行选择。
注意点:在 limit Photo 模式下,AssetsLibrary 访问相册会失败;在 writeOnly 模式下,AssetLibrary 也会有显示问题。建议还在使用 AssetsLibrary 的同学尽快迁移到新 API。
授权相关:旧 API 废弃,增加 PHAccessLevel 参数。如果再使用以前的API来获取权限状态,PHAuthorizationStatusLimited 状态下也会返回 PHAuthorizationStatusAuthorized
[YYImage] iOS 14 YYAnimatedImageView 无法显示正常图片 ([YBImageBrowser]框架有引用,可解决)
没改源码,以防更新,用类别hook了那个方法:displayLayer:
//
// YYAnimatedImageView+swizzling.h
// MBALib
//
// Created by 1 on 2020/9/25.
// Copyright © 2020. All rights reserved.
// 修复yyimage iOS14出现了bug
#import "YYAnimatedImageView.h"
NS_ASSUME_NONNULL_BEGIN
@interface YYAnimatedImageView (swizzling)
@end
NS_ASSUME_NONNULL_END
//
// YYAnimatedImageView+swizzling.m
// MBALib
//
// Created by 1 on 2020/9/25.
// Copyright © 2020. All rights reserved.
//
#import "YYAnimatedImageView+swizzling.h"
#import <objc/runtime.h>
@implementation YYAnimatedImageView (swizzling)
+ (void)load
{
Method a = class_getInstanceMethod(self, @selector(displayLayer:));
Method b = class_getInstanceMethod(self, @selector(swizzing_displayLayer:));
method_exchangeImplementations(a, b);
}
- (void)swizzing_displayLayer:(CALayer *)layer
{
//通过变量名称获取类中的实例成员变量
Ivar ivar = class_getInstanceVariable(self.class, "_curFrame");
UIImage *_curFrame = object_getIvar(self, ivar);
if (_curFrame) {
layer.contents = (__bridge id)_curFrame.CGImage;
} else {
if (@available(iOS 14.0, *)) {
[super displayLayer:layer];
}
}
}
@end
有其他问题,可点下面继续参考:
参考:https://www.cnblogs.com/fakeCoder/p/13722967.html
https://github.com/ibireme/YYImage/issues/149
https://www.jianshu.com/p/bf1c4ad44f5e?utm_campaign=hugo