• 适配ios11与iphone x实践


    一、适配 iOS11

      问题1项目中有原生与 H5 的交互,运行在 iOS11 时,直接漰溃在框架 WebViewJavascriptBridge 内部

      报错信息:Completion handler passed to -[WKWebViewJavascriptBridge webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once

      解决:当时第一时间肯定是立即看 github 上该框架的 issue,果然找到了解决方案。该 issue 链接:https://github.com/marcuswestin/WebViewJavascriptBridge/issues/302,详情如下图

      

      按照上述提供的解决方案修改就好了,下图是修改前与修改后对比 ( 左图修改前,右图修改后 )

                

      问题2:用户首次安装时, 定位权限框不弹出?

      解决:原来在ios 11内权限的请求被降级了,因为之前工程内首次请求定位权限使用的方法为 requestAlwaysAuthorization,在ios11内直接使用它请求定位无效,应该在info.plist增一个权限,如下:

      ps:  requestAlwaysAuthorization 方法是请求前后定位所有权限,因为 app 需要在后台定位,所以使用的这个方法。如果 app 只要在使用期间定位,则应使用 requestWhenInUseAuthorization, 这个方法在 ios 11,可以正常弹出定位请求框。

      问题3:ios11中tableView分组间距变大。

      解决:原来组尾间距之前实现了 heightForFooterInSection,而没有实现 viewForFooterInSection 方法,在 ios11 之前是没问题,但现在就都要实现,如果不需要他们之前有间距需要这样设置

    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
    {
        return 0.01;
    }
    
    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
    {
        return nil;
    }

      问题4:关于 tableView 或 scrollView 的在 ios11 中新增加的 contentInsetAdjustmentBehavior 属性问题

      解决:看我上一篇博客 http://www.cnblogs.com/buerjj/p/7655090.html

      问题5:将第三方框架代码拖入 Xcode 9 工程中,使用时报错。例如:gitHub 下载最新的 masonry 源码,将 masonry 文件拖入工程中,勾上 copy items if needed,选择 create groups,勾上 Add to targets。使用 masonry 代码如下

    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.mas_equalTo(self.view);
    }];

      然后发现的 masonry 报错如下: [UITableView mas_makeConstraints:]: unrecognized selector sent to instance 0x7f9c6f0b7200 

      原因:Xcode 9 拖入第三方代码不会将代码放入工程编译,拖入 masonry 文件夹后,点工程 - build phases - compile sources ,会发现这里没有 masonry 相关文件。

      解决1:点工程 - build phases - compile sources 点 + 号,将 masonry 加入编译。

      解决2:不要使用拖入,应点击工程,右键 Add Files To

      备注:这应该是 Xcode 9.0 bug,据说9.1beta版已经修复。看此链接:http://blog.csdn.net/thoris/article/details/78139274?locationNum=7&fps=1

      ps: 最近做路径规划,在集成高德地图时拖入第三方代码时也是因为这个原因报错。使用同样的方式都可以解决。亲测。

    二、适配 iPhone X

      问题1:在 iPhone x 模拟器上有 tabBar 时,push 页面底部的 tabBar 会向上跳动一下,然后返回回来后又是 tabBar 又正常,再 push 又会跳动。

      解决:在拦截所有控制器push的地方加上如下代码

        // 适配 iPhoneX
        CGRect frame = self.tabBarController.tabBar.frame;
        frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
        self.tabBarController.tabBar.frame = frame;

      问题2:导航栏高度问题;因为工程中没有使用系统的导航栏,全是自定义的 view,所以在 iphone x上,导航栏高度还是 64 显然是不对的。

      解决:所以加入导航栏的宏定义,利用 [UIApplication sharedApplication].statusBarFrame.size.height + 44 就可以动态得到导航栏高度。其他就不用修改了,只需要调整一下高度。还好之前导航栏自定义时内部的布局封装得比较好。

      问题3:底部tabBar变高。

      解决:因为使用的是系统tabBar,高度会自动适配,但 view 中有些布局如果相对于原来 tabBar 写死了 49 的高度的话,那就不行了,所以根据屏幕高度判断是否为 iPhone X,用宏定义写 tabBar 的高度。这部分宏定义如下所示:

    // 是否是iphoneX
    #define     kIsIphoneX      ([UIScreen mainScreen].bounds.size.height == 812 ? YES : NO)
    
    // tabbar高度
    #define     kTabBarH        (kIsIphoneX ? 83 : 49)

       上面这种用宏定义来指定 tabBar 高度是当 tabBar 高度获取不到情况下使用它比较方便,因为有些情况如当 app 启动或者一些其他时机 tabBar 还没有加载,当代码中要使用这个高度就用上面方法获取。如果当 tabBar 加载完成时,尽量通过控制器层级关系去获取 tabbar 的高度。比如下面这样:

    UITabBarController *tabbarController = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
    CGFloat tabbarH = tabbarController.tabBar.height;
  • 相关阅读:
    微服务架构编码构建
    Keepalived+Nginx 高可用集群
    Nginx 动静分离
    Nginx 负载均衡
    Nginx 反向代理
    Nginx 常用命令
    React.js |Refs转发
    React.js |错误边界
    做一个简约的博客园皮肤
    React.js |Context的作用与用法
  • 原文地址:https://www.cnblogs.com/buerjj/p/7652120.html
Copyright © 2020-2023  润新知