美文网首页iOS常用iOS
iOS开发遇到的问题汇总持续更新

iOS开发遇到的问题汇总持续更新

作者: RiberWang | 来源:发表于2021-02-05 08:49 被阅读0次
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相关问题

请参照master源问题M1芯片问题


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使用新的构建系统,导入控制器时有时提示,自定义视图不提示头文件
暂未解决

相关文章

网友评论

    本文标题:iOS开发遇到的问题汇总持续更新

    本文链接:https://www.haomeiwen.com/subject/vlrwtltx.html