• IOS6和IOS7的屏幕适配问题


    自从IOS7出来以后,以前写在IOS6上或者更低版本的程序,跑在IOS7的模拟器上就会出现一些问题。最大的问题就是,所有的UI空间都会统一向上移动20个点(如果空间的y值为0,就会被StatusBar挡住),造成原来在IOS6下精心布局的界面在IOS7下特别难看。

    IOS7和IOS6最大的区别,除了扁平化设计以外,就是全屏App。在IOS7的情况下,状态栏也是控制器的View的一部分。坐标点的y值,不再是从StatusBar的底部开始,而是从StatusBar的顶部开始。我们可以很明显地感受到,以前在IOS6的情况下,我们用 [UIApplication ShareApplication].StatusBarStyle 来设置状态栏的样式。但是用IOS7的情况下,该方法是无效的。相反,设置StatusBar的样式的方法,被Apple放在Controller里面了,成为了控制器方法,不在交给UIApplication来处理。

    为了解决IOS6和IOS7的适配问题,我针对不同情况列举了一些方法,供广大开发者参考。

    一、没有包装任何 导航控制器 或者 UITabBarController

    1.控制器的viewUIScrollViewUITableViewUICollectionView时(控制器是UITableViewController的时候)

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        

    #ifdef __IPHONE_7_0

        if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {

            self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

        }

    #endif

    }

    2.控制器的view是普通的UIView,非UIScrollView

    #ifdef __IPHONE_7_0

    - (void)viewDidLayoutSubviews

    {

        // iOS7 && 没有包装导航控制器

        if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0 && self.navigationController == nil) {

            CGFloat top = [self.topLayoutGuide length];

            

            // 是否能滚动

            if ([self.view isKindOfClass:[UIScrollView class]]) {

                UIScrollView *scroll = (UIScrollView *)self.view;

                scroll.contentInset = UIEdgeInsetsMake(top, scroll.contentInset.left, scroll.contentInset.bottom, scroll.contentInset.right);

            } else {

                CGRect bounds = self.view.bounds;

                bounds.origin.y =  - top;

                self.view.bounds = bounds;

            }

        }

    }

    #endif

    二、包装有导航控制器的情况

    1> 控制器的view不是UIScrollView

    #ifdef __IPHONE_7_0

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {

        self.edgesForExtendedLayout = UIRectEdgeNone;

    }

    #endif

    2> 控制器的viewUIScrollView

    不需要写额外的代码适配

    三、其他情况(上述情况不用死机,只要掌握以下几点规律)

    1.想让view的内容往下挪动

    1> UIView设置boundsy

    2> UIScrollView设置contentInsettop

    2.防止子控制器的view被导航栏或者tabbar遮住

    self.edgesForExtendedLayout = UIRectEdgeNone;

    四、多控制器嵌套处理

    1.当多重控制器嵌套的时候,最合理的方案是:UITabBarController内部嵌套UINavigationController

    2.UITableViewController的直接父控制器是UINavigationController时,不需要编写任何适配代码

    3.其他非UITableViewController需要加上适配代码

    #ifdef __IPHONE_7_0

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {

        self.edgesForExtendedLayout = UIRectEdgeNone;

    }

    #endif

  • 相关阅读:
    PatentTips
    PatentTips
    PatentTips
    Xvisor ARM32 启动分析
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    PatentTips
  • 原文地址:https://www.cnblogs.com/gatsbywang/p/3503485.html
Copyright © 2020-2023  润新知