iOS屏幕适配

作者: MrFire_ | 来源:发表于2016-04-09 17:11 被阅读737次

    前言

    在项目中,屏幕适配也是一个不容小觑的问题,特别是在一个屏幕上需要一堆各种各样的图片布局的时候着实得费点功夫,于是自己动手写了一个适配方案,它会根据不同的手机尺寸对图片进行等比缩放,达到快速适配的效果,使用的时候很方便,我们再也不用担心在一个型号适配好后其他机型出现图片变形或者参差不齐的问题,先看效果,由于图片不太容易找,我就做了一个很简单的demo,最后一张图片不到边,不过不影响使用了,大家可以看一下图片在各种屏幕中的比例,是没有发生变化的:

    • 6s plus


      Simulator Screen Shot 2016年4月9日 下午3.55.25.png
    • 6s
    Simulator Screen Shot 2016年4月9日 下午3.59.55.png
    • 5s
    Simulator Screen Shot 2016年4月9日 下午4.00.31.png
    • 4s
    Simulator Screen Shot 2016年4月9日 下午4.01.12.png
    其中,橘黄色的那个模拟的导航栏的高度,固定44 dot,导航栏的上部留出了固定的20 dot,总共是64 dot

    实现

    • 头文件
    /**
     *  对frame进行缩放,得到缩放后的frame,适用于使用绝对坐标来写控件的frame
     *
     *  @param x      x
     *  @param y      y
     *  @param width  width
     *  @param height height
     *
     *  @return CGRect(缩放后)
     */
    +(CGRect ) makeFrameX:(CGFloat) x Y:(CGFloat) y W:(CGFloat) width H:(CGFloat) height;
    /**
     *  以其它控件的y坐标作为参照,返回该控件的frame
     *
     *  @param x         该控件的x坐标
     *  @param RelativeY 其它控件的y坐标 + ...
     *  @param width     该控件的宽度
     *  @param height    该控件的高度
     *
     *  @return CGRect
     */
    +(CGRect ) makeCloseWidgetFrameX:(CGFloat) x relativeY:(CGFloat) relativeY W:(CGFloat) width H:(CGFloat) height;
    /**
     *  以其它控件的x和y坐标作为参照,返回该控件的frame
     *
     *  @param Relativex 其它控件的x坐标 + ...
     *  @param y         其它控件的y坐标 + ...
     *  @param width     该控件的宽度
     *  @param height    该控件的高度
     *
     *  @return CGRect
     */
    +(CGRect ) makeCloseWidgetFrameRelativeX:(CGFloat) relativeX relativeY:(CGFloat) relativeY W:(CGFloat) width H:(CGFloat) height;
    /**
     *  以其它控件的x坐标作为参照,返回该控件的frame
     *
     *  @param Relativex 其它控件的x坐标 + ...
     *  @param y         该控件的y坐标
     *  @param width     该控件的宽度
     *  @param height    该控件的高度
     *
     *  @return CGRect
     */
    +(CGRect ) makeCloseWidgetFrameX:(CGFloat) relativeX Y:(CGFloat) y W:(CGFloat) width H:(CGFloat) height;
    /**
     *  用于创建固定高度的导航栏
     *
     *  @param x              该控件的x坐标
     *  @param y              该控件的y坐标
     *  @param width          该控件的宽度
     *  @param constantHeight 该控件的固定高度
     *
     *  @return CGRect
     */
    +(CGRect ) makeConstantHeightWidgetFrameX:(CGFloat) x Y:(CGFloat) y W:(CGFloat) width constantHeight:(CGFloat) constantHeight;
    

    如果你觉得这样的定制性仍然太强,有些更深层次的定制这几个接口无法做到,那么可以使用下面这几个单独的对x、y、w、h进行单独的定制,不过一般也是用不到的,上面这几个接口已经足够平常的使用了:

    /****************************************************
     *                                                  *
     *    下面这些一般是用不到的,除非是在定制性比较高的地方     *
     *                                                  *
     ****************************************************
     */
    /**
     *  单独定制x
     *
     *  @param x x坐标
     *
     *  @return 返回缩放过后的x
     */
    +(CGFloat ) makeX:(CGFloat )x;
    /**
     *  单独定制y
     *
     *  @param y y坐标
     *
     *  @return 返回缩放过后的y
     */
    +(CGFloat ) makeY:(CGFloat )y;
    /**
     *  单独定制宽
     *
     *  @param w 宽度
     *
     *  @return 返回缩放过后的宽度
     */
    +(CGFloat ) makeW:(CGFloat )w;
    /**
     *  单独定制高
     *
     *  @param h 高度
     *
     *  @return 返回缩放过后的高度
     */
    +(CGFloat ) makeH:(CGFloat )h;
    

    • 使用
      贴了这么多,还没说如何使用,不要急,来了:
      1、先说一下使用前需要先设置的地方,当然前提得导入头文件ZYGFrameMake.h才行
      ZYGFrameMake.m中有这样一个地方
    屏幕快照 2016-04-09 下午4.30.17.png
    在使用之前我们需要在这个地方设置一下基准,一般情况下UI都会给我们一个基准图(大部分都是6,但也不排除其他的情况),如果你的基准是iphone6的话那这里就不用再进行修改了,如果不是那就在这里直接修改成相应的屏幕的宽和高,即如果你的基准图是5或者5s的话就把baseScreenWidth修改成320baseScreenHeight修改成568,4s或者6p同理。是的,就需要设置这一个地方,然后就可以直接把UI给的标注直接扔到代码中了,再也不用担心什么宽了高了还有什么起始位置,直接写UI给的数字就可以了。
    2、创建导航栏,导航栏为固定高度,所以我们需要调用创建导航栏专用的那个方法,其内部对坐标y进行了处理(要保持状态栏的20不发生变化)
        //在这里,以iPhone6为基准,所以宽度直接写375就可以了
        UIImageView *navImage = [[UIImageView alloc] initWithFrame:[ZYGFrameMake makeConstantHeightWidgetFrameX:0 Y:20 W:375 constantHeight:44]];
        navImage.backgroundColor = [UIColor orangeColor];
        NSLog(@"导航栏高度:%f",navImage.frame.size.height);//从打印的结果中我们可以看到在各种机型中导航栏的高度始终为44
        [self.view addSubview:navImage];
    

    3、创建一张图片,紧贴在导航栏的下方,因为是紧贴在导航栏的下方,所以在竖直方向上是取相对于导航栏的坐标

        UIImageView *image1 = [[UIImageView alloc] initWithFrame:[ZYGFrameMake makeCloseWidgetFrameX:0 relativeY:navImage.frame.origin.y + navImage.frame.size.height W:375 H:180]];
        image1.image = [UIImage imageNamed:@"003"];
        NSLog(@"image1的y坐标:%f",image1.frame.origin.y);
        [self.view addSubview:image1];
    

    4、最后说一下示例中最后一张图片,其x坐标是相对于左边的那张图片来计算的,而y坐标是相对于上部的那张图片来计算的,所以使用下面这个方法来算,当然我们大可不必这样来写,就像刚开始我说的一样直接按UI给的标注去写也是完全可以的,但那调用的方法就不能是下面这个,而应该是*+(CGRect ) makeFrameX:(CGFloat) x Y:(CGFloat) y W:(CGFloat) width H:(CGFloat) height *了,这两种方法的区别就在于一个是相对坐标,一个是绝对坐标。

        UIImageView *image3 = [[UIImageView alloc] initWithFrame:[ZYGFrameMake makeCloseWidgetFrameRelativeX:image2.frame.origin.x + image2.frame.size.width relativeY:image2.frame.origin.y W:120 H:100]];
        image3.image = [UIImage imageNamed:@"001"];
        [self.view addSubview:image3];
    


    • End

    相关文章

      网友评论

      • 若锦:正好为适配发愁呢,明天试试你的方案,多谢分享
        MrFire_: @雨汐流若 有问题多多交流,共同进步!

      本文标题:iOS屏幕适配

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