iOS从头开始做一个APPiOS点点滴滴iOS Developer

iOS 13 适配总结

2019-08-27  本文已影响0人  NEWWORLD

自从6月份的 WWDC大会展示了iOS 13的新版本之后,广大开发者朋友又面临着新一轮的系统升级适配工作;随着苹果9月份发布会脚步的临近,对公司的App升级适配势在必行。

iOS 13发现问题回顾

将所有问题归纳总结,得出以下几点解决方案的建议和示例代码,记录一下

1. UITextField

2. UISearchBar

通过valueForKeysetValue: forKeyPath获取和设置私有属性程序崩溃
//  修改searchBar的textField
UISearchBar *searchBar = [[UISearchBar alloc] init];

//  iOS 13之前可直接获取,然后修改textField相关属性
UITextField *searchTextField = [searchBar valueForKey:@"_searchField"];

修改建议:可遍历searchBar的所有子视图,找到指定的UITextField类型的子视图,根据上述UITextField的相关方法修改属性;也可根据UITextField自定义UISearchBar的显示

//  UISearchBar+CIChangePrivateSubviews.m文件

//  修改SearchBar的系统私有子视图

#import "UISearchBar+CIChangePrivateSubviews.h"

@implementation UISearchBar (CIChangePrivateSubviews)

/// 修改SearchBar系统自带的TextField
- (void)changeSearchTextFieldWithCompletionBlock:(void(^)(UITextField *textField))completionBlock {

    if (!completionBlock) {
        return;
    }

    UITextField *textField = [self findTextFieldWithView:self];
    if (textField) {
        completionBlock(textField);
    }
}

/// 递归遍历UISearchBar的子视图,找到UITextField
- (UITextField *)findTextFieldWithView:(UIView *)view {

    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UITextField class]]) {
            return (UITextField *)subview;
        }else if (!IsArrEmpty(subview.subviews)) {
            return [self findTextFieldWithView:subview];
        }
    }
    return nil;
}

@end

3. UITableView

iOS 13设置cell.contentView.backgroundColor会影响cellselected或者highlighted时的效果

例如:如果设置cell.selectedBackgroundView为自定义选中背景视图,并修改cell.contentView.backgroundColor为某种不透明颜色;contentView就会遮盖cell.selectedBackgroundView,最终导致无法看到自定义的selectedBackgroundView效果。

修改建议:不设置contentView.backgroundColor时,默认值为nil;改为直接设置cell本身背景色

//  自定义cell.m文件

//  iOS 13之前正常
self.contentView.backgroundColor = [UIColor blueColor];
//  iOS 13改为
self.backgroundColor = [UIColor blueColor];

备注:iOS 13UITableView还做了一些其他的修改,详细内容可查阅最底部 参考内容1,整个网页搜索UITableViewCell即可

4. UITabbar

5. UITabBarItem

6. 弹出ViewController样式变化

模态展示UIModalPresentationStyle类型新增UIModalPresentationAutomatic API_AVAILABLE(ios(13.0)) = -2

用户调用presentViewController:animated:completion:方法弹出视图时,iOS 13效果变化更炫酷,可以在iOS 13系统App中体验到这种变化;
如果不希望使用这种效果,可利用Runtime方法,恢复设置modalPresentationStyleUIModalPresentationFullScreen

//  UIViewController+CIChangePresentStyle.m文件

#import "UIViewController+CIChangePresentStyle.h"

@implementation UIViewController (CIChangePresentStyle)

+ (void)load {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        //替换方法
        SEL originalSelector = @selector(presentViewController:animated:completion:);
        SEL swizzledSelector = @selector(ci_presentViewController:animated:completion:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);;
        BOOL didAddMethod =
        class_addMethod(class,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));

        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (void)ci_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

    viewControllerToPresent.modalPresentationStyle = UIModalPresentationFullScreen;
    [self ci_presentViewController:viewControllerToPresent animated:flag completion:completion];
}

@end

7. 第三方SDK相关

以上就是适配iOS 13的一些修改建议。如果各位朋友发现有一些新问题和解决方案,可以在评论区留言,希望大家畅所欲言,共同发现并帮助解决问题。

参考内容

  1. iOS & iPadOS 13 Beta 6 Release Notes
  2. 友盟+推出全新SDK,适配iOS 13
  3. 新浪微博 iOS SDK
上一篇下一篇

猜你喜欢

热点阅读