完成以上教程后,我们的应用就差不多已经完成70%了,接下来,就让我们进一步的去优化它吧!
首先要做的,就是要对其进行适配。
现在的iOS设备屏幕尺寸越来越丰富,那么该采用怎样的策略来适配这么多设备的屏幕呢!先来看下有哪些屏幕尺寸吧!
image
在这个工程中,我采用了的策略是选择一种设备的屏幕尺寸来作为开发的标准,例如我这里采用的是5.5寸的iPhone6plus屏幕的尺寸,来设置一个比例系数,
funcscaleW()->CGFloat{return(screenWidth/414*CGFloat(self))}funcscaleH()->CGFloat{return(screenHeight/667*CGFloat(self))}这样,在布局的时候,就可以考虑使用上面的这个系数,来设置高度和宽度:
///根据模型计算ViewframeclassfunccaculateFrame()->CGRect{letheight:CGFloat=sectionC_height*CGFloat(scaleW)letwidth:CGFloat=CGFloat(kScreenWidth)returnCGRect(x:0,y:0,width:width,height:height)}为了方便,在工程中可以通过增加extension扩展的方式,将需要用到的比例系数实现出来:
importUIKitletkScreenWidth=UIScreen.main.bounds.width//max(UIScreen.main.bounds.height,UIScreen.main.bounds.width)letkSreenHeight=UIScreen.main.bounds.height//min(UIScreen.main.bounds.height,UIScreen.main.bounds.width)letkSreenBounds=UIScreen.main.boundsletkLeftMargin:CGFloat=20.0letkTopMargin:CGFloat=20.0letsectionA_height:CGFloat=200+40letsectionB_height:CGFloat=140+40letsectionC_height:CGFloat=100letsectionD_height:CGFloat=180letsectionE_height:CGFloat=250+40///布局ACell的宽度letitemA_width:CGFloat=120///headview高letHEADVIEW_H:CGFloat=40extensionCGFloat{funcscaleW()->CGFloat{return(screenWidth/414*CGFloat(self))}funcscaleH()->CGFloat{return(screenHeight/667*CGFloat(self))}}常见屏幕适配方式屏幕适配的方式有很多,大家可以选择原生或者第三方开源的屏幕适配方式,例如:
Apple在iOS13上推出了DarkMode的新特性。那如何去适配此新特性呢!我们需要从俩个方面来适配,一个是颜色,另一个就是图片,接下来让我们一起来看看具体是怎么操作的吧!
iOS13在UIColor中增加了一个初始化方法,我们可以用这个初始化方法来创建动态颜色。
@available(iOS13.0,*)publicinit(dynamicProvider:@escaping(UITraitCollection)->UIColor)当系统从LightMode和DarkMode之间切换的时候就会触发这个回调。
于是,我们可以通过为UIColor增加extension扩展的方式,来为App的背景色和字体颜色做适配,代码如下:
首先,打开Assets.xcassets,随后将我们的图片资源一一的拖动到里面去,图片资源的格式想必大家都很清楚,Apple要求的是需要提供三套:@1x,@2x,@3x,要想生成此类格式的图片,可以借助外部的工具来制作,例如Sketch,Figma等。
由于需要适配不同模式,所以需要两套不同的图片资源,并且在右边设置Appearances时选择Any,Dark。设置完后,我们就可以将另一套的图片资源挨个拖入对应的位置中,如图:
在Assets.xcassets中配置好图片,使用时只需要调用如下方法,适配工作就会自动完成。