1. 通过UIDeviceOrientation获取设备方向时,第一次为UIDeviceOrientationUnknown,方向未知。
通过状态栏方向获取设备方向,iOS13以上新增UIWindowScene,由这个类获取设备方向,iOS13以下可通过状态栏的方向获取
+ (UIDeviceOrientation)getDeviceOrientation {
if (@available(iOS 13.0, *)) {
UIWindowScene *windowScenen = (UIWindowScene *)[UIApplication sharedApplication].keyWindow.windowScene;
return (UIDeviceOrientation)windowScenen.interfaceOrientation;
} else {
// Fallback on earlier versions
return (UIDeviceOrientation)[UIApplication sharedApplication].statusBarOrientation;
}
}
2. UISwitch的size不可控制,可通过CGAffineTransformMakeScale改变大小比例
官方说明
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; // This class enforces a size appropriate for the control, and so the frame size is ignored.
添加布局代码
self.markSwitch = [[UISwitch alloc] init];
[clickButton addSubview:self.markSwitch];
self.markSwitch.transform = CGAffineTransformMakeScale(0.5, 0.5);
[self.markSwitch layoutIfNeeded];
// 居右上角
[self.markSwitch mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(clickButton).offset(-self.markSwitch.height/2 + 3);
make.right.equalTo(clickButton).offset(self.markSwitch.width/2 - 5);
}];
3. Xcode11新建项目新增SceneDelegate文件
iOS13之前,AppDelegate的职责全权处理App生命周期和UI生命周期;
iOS13之后(包括13)AppDelegate的职责发现了改变:
1、处理 App 生命周期;
2、新的 Scene Session 生命周期;
而UI生命周期则交给SceneDelegate处理。
处理方法:
1. 删除SceneDelegate文件(删除info.plist文件中的Application scene manifest 和AppDelegate里面关于SceneDelegate的2个方法),改为原来的方法
2. 使用新方法,初始化window方法改变
- 适配iOS13以下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法增加判断
if (@available(iOS 13,*)) {
return YES;
}
else {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[[RootVC alloc] init]];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
- 适配iOS13以上(包含13)
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions API_AVAILABLE(ios(13.0))
方法中初始化window
self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
self.window.backgroundColor = [UIColor systemBackgroundColor];
RootVC *vc = [[RootVC alloc] init];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:vc];
[self.window makeKeyAndVisible];
4. 暗黑模式(黑暗模式,深色模式)适配
由于篇幅太长,请参照此篇文章
2021.2.5
5. 判断是否是iPhone X系列机型
如果项目中有SceneDelegate文件,则iOS13之后需增加判断条件。UI生命周期则交给SceneDelegate处理,因此获取window的方法也相应改变。
#define IS_IPHONEX_SERIES \
({BOOL isIphoneX = NO; \
if (@available(iOS 11.0, *)) { \
if (@available(iOS 13.0, *)) { \
CGFloat safeBottom = [UIApplication sharedApplication].windows.firstObject.safeAreaInsets.bottom; \
if (safeBottom > 0) { \
isIphoneX = YES; \
} \
} \
else { \
CGFloat safeBottom = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom; \
if (safeBottom > 0) { \
isIphoneX = YES; \
} \
} \
} \
(isIphoneX);})
6. iPhone X系列安全距离不同。竖屏状态下有44、48、47等(可能还有其他数值);横竖屏切换时也不相同:横屏时左右的安全距离相同,由原来竖屏下底部安全距离34改为与顶部安全距离相同。即横屏时左右安全距离相同,都为竖屏下顶部安全距离。
适配方案:如果项目中带SceneDelegate文件可添加以下代码,不带该文件的项目可去除iOS13的判断。
+ (UIEdgeInsets)getIphoneSafeInsets {
UIEdgeInsets safeInsets = UIEdgeInsetsMake(20, 0, 0, 0);
if (@available(iOS 11.0, *)) {
if (@available(iOS 13.0, *)) {
safeInsets = [UIApplication sharedApplication].windows.firstObject.safeAreaInsets;
}
else {
safeInsets = [[UIApplication sharedApplication] delegate].window.safeAreaInsets;
}
}
if (safeInsets.top < 20) {
safeInsets.top = 20;
}
return safeInsets;
}
2021.2.6
7. pod相关问题
2021.2.20
8. UICollectionview滚动到指定位置问题
通过以下方法不能滚动到指定位置
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
可使用scrollview的偏移量滚动到指定位置,具体原因不清楚!
// 延迟操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.collectionView setContentOffset:CGPointMake(0, 130) animated:NO]; // 130 header+footer
});
9. Xcode13.1导入头文件不提示
问题描述:Xcode13.1使用新的构建系统,导入控制器时有时提示,自定义视图不提示头文件
暂未解决
网友评论