美文网首页
iOS开发技巧(OC版):关于iOS11适配的一些坑

iOS开发技巧(OC版):关于iOS11适配的一些坑

作者: Sam_xing | 来源:发表于2017-09-21 18:07 被阅读360次

    安全区域(Safe Area)

    在iOS11以前, 自定义UIViewController时, 从来没有考虑过topLayoutGuide和bottomLayoutGuide这两个属性.但是在iOS11出来之后,这两个属性被废弃,取而代之的就是safeArea的概念,safeArea是描述你的视图部分不被任何内容遮挡的方法。 它提供两种方式:safeAreaInsets或safeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域如图所示:

    iPhone X图

    在除了iPhone X以外的型号手机上, UINavigationController 就是 topLayoutGuide区域. UITabBarController就是bottomLayoutGuide.但是这两个属性在iOS11已经被取代了. 取而代之的就是safeArea区域(iPhone X图区域4部分)

    当我们自定义一个UIViewController, 内部嵌套了UINavigationController 或者UITabBarController的时候. 运行程序会出现以下错误:

    图1-1

    原因是少了:

    具体是为什么,没有细研究.不过解决办法如下:

    图1-2

    因为我是创建的空项目所以只有LaunchScreen.storyboard..如果你的项目里还有Main.storyboard,那么 你需要把第四个勾勾也去掉.

    iPhone X 竖屏UINavigationController和UITabBarController尺寸问题

    iPhone X竖屏

    区域一: 高度30

    区域二:高度14

    区域三:高度44

    区域五:高度49

    区域六:高度14

    区域七:高度20

    iOS横屏UITabBarController

    更新iOS11以后, UITabBarController上的图标文字由原来的垂直放置, 变成水平放置

    iPhone X 横屏UINavigationController和UITabBarController尺寸问题

    iPhone X横屏

    iPhone X 横竖屏在尺寸上有很多细微的差别.

    UINavigationController

    我们打印UINavigationController  navigationBar的时候发现他的高度为44.也就是上图绿色区域.但是在实际显示的时候确实红色区域,高度为32.整个高度向上12.也就是蓝色区域.

    UITabBarController

    我们打印UITabBarController  tabBar的时候发现他的高度为32,就是橘色区域,红色区域为功能区,高度为21.我们是何止tabBar颜色的时,包括橘色区和红色区.

    控制大标题的显示

    待更新

    屏幕未充满?底部tabbar留白

    解决方案: 准备一张尺寸:1125 * 2436的启动图片,  添加到Assret中

    iOS11导航栏自定义按钮偏移问题

    解决方案: 通过改变按钮的 contentEdgeInsets和imageEdgeInsets的值成功改变了按钮的偏移问题,单独设置contentEdgeInsets也可达到一定的效果。

    UITableview UICollectionView MJRefresh下拉刷新错乱

    解决方案:iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

    关于iPhone X 横竖屏切换时,UI适配错误

    - (void)createView:(BOOL)useForRendering showRightAway:(BOOL)showRightAway;

    {

        if(_view == nil)

        {

            NSString *deviceVersion = [self getDeviceVersion];

            if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

            {

                CGRect bounds = CGRectMake(34, 0, 744, 375);

                _window  = [[UIWindow alloc] initWithFrame:bounds];

            }

            else

            {

                _window = [[UIWindow alloc] initWithFrame: _screen.bounds];

            }

            _window.screen = _screen;

            if(_screen == [UIScreen mainScreen])

            {

                _view = [[GetAppController() init] unityView];

                NSAssert([_view isKindOfClass:[UnityView class]], @"You MUST use UnityView subclass as unity view");

            }

            else

            {

                _view = [(useForRendering ? [UnityRenderingView alloc] : [UIView alloc]) initWithFrame: _screen.bounds];

            }

            _view.contentScaleFactor = UnityScreenScaleFactor(self.screen);

            [self updateScreenSize];

            if(showRightAway)

            {

                [_window addSubview:_view];

                [_window makeKeyAndVisible];

            }

        }

    }

    - (NSString*)getDeviceVersion

    {

        struct utsname systemInfo;

        uname(&systemInfo);

        NSString *deviceVersion = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

        NSLog(@"添加获取手机型号方法 ++ %@", deviceVersion);

        return deviceVersion;

    }

    - (void)updateScreenSize

    {

        CGSize layerSize    = _view.layer.bounds.size;

        NSString *deviceVersion = [self getDeviceVersion];

        if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

        {

            layerSize = CGSizeMake(744, 375);

        }

        CGFloat scale      = UnityScreenScaleFactor(_screen);

        _screenSize = CGSizeMake(layerSize.width * scale, layerSize.height * scale);

    }

    相关文章

      网友评论

          本文标题:iOS开发技巧(OC版):关于iOS11适配的一些坑

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