iOS 屏幕比例适配

简介: iOS 屏幕比例适配

本文主要介绍如何简单快捷的使用屏幕适配,快速按照设计图尺寸布局


简单使用


在最初的地方AppDelegate里面调用 [UIResponder kj_adaptModelType:KJAdaptTypeIPhone6];
然后在需要适配的地方 替换 CGRectMake 为 KJAdaptRectMake
view.frame = CGRectMake(0, 0, 10, 10);
替换为
view.frame = KJAdaptRectMake(0, 0, 10, 10);
即可完成简单的屏幕比例适配


简单描述思路


1.声明设计图手机类型


/// 适配类型 设计图类型
typedef NS_ENUM(NSInteger, KJAdaptModelType) {
    KJAdaptTypeIPhone4 = 0, /// 3.5英寸,320 x 480pt
    KJAdaptTypeIPhone5,     /// 4.0英寸,320 x 568pt
    KJAdaptTypeIPhone6,     /// 4.7英寸,375 x 667pt
    KJAdaptTypeIPhone6P,    /// 5.5英寸,414 x 736pt
    KJAdaptTypeIPhoneX,     /// 5.8英寸,375 x 812pt
    KJAdaptTypeIPhoneXR,    /// 6.1英寸,414 x 896pt
    KJAdaptTypeIPhoneXSMax, /// 6.5英寸,414 x 896pt
//    KJAdaptTypeIPhone12Mini,/// 5.4英寸,
//    KJAdaptTypeIPhone12ProMax,/// 6.7英寸,
};


2.委托确定设计图的类型


@protocol KJResponderAdaptProtocol <NSObject>
/// 设计图机型,只需要在最初的地方调用一次即可
+ (void)kj_adaptModelType:(KJAdaptModelType)type;
@end
+ (KJAdaptModelType)adaptType{
    return (KJAdaptModelType)[objc_getAssociatedObject(self, @selector(adaptType)) intValue];
}
+ (void)setAdaptType:(KJAdaptModelType)adaptType{
    objc_setAssociatedObject(self, @selector(adaptType), @(adaptType), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (void)kj_adaptModelType:(KJAdaptModelType)type{
    self.adaptType = type;
}
3.按比例确定宽高


CGFloat KJAdaptScaleLevel(CGFloat level){
    if (level == 0) return 0.0;
    CGFloat width;
    switch (UIResponder.adaptType) {
        case KJAdaptTypeIPhone4:width = 320;break;
        case KJAdaptTypeIPhone5:width = 320;break;
        case KJAdaptTypeIPhone6:width = 375;break;
        case KJAdaptTypeIPhone6P:width = 414;break;
        case KJAdaptTypeIPhoneX:width = 375;break;
        case KJAdaptTypeIPhoneXR:width = 414;break;
        case KJAdaptTypeIPhoneXSMax:width = 414;break;
        default:break;
    }
    return level*([[UIScreen mainScreen]bounds].size.width/width);
}
CGFloat KJAdaptScaleVertical(CGFloat vertical){
    return KJAdaptScaleLevel(vertical);
}


4.替换方法


CGFloat KJAdaptScaleVertical(CGFloat vertical){
    return KJAdaptScaleLevel(vertical);
}
CGPoint KJAdaptPointMake(CGFloat x, CGFloat y){
    return CGPointMake(KJAdaptScaleLevel(x), KJAdaptScaleVertical(y));
}
CGSize KJAdaptSizeMake(CGFloat width, CGFloat height){
    return CGSizeMake(KJAdaptScaleLevel(width), KJAdaptScaleVertical(height));
}
CGRect KJAdaptRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height){
    return CGRectMake(KJAdaptScaleLevel(x), KJAdaptScaleVertical(y), KJAdaptScaleLevel(width), KJAdaptScaleVertical(height));
}
UIEdgeInsets KJAdaptEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right){
    return UIEdgeInsetsMake(KJAdaptScaleVertical(top), KJAdaptScaleLevel(left), KJAdaptScaleVertical(bottom), KJAdaptScaleLevel(right));
}


最后附上完整分类

//  简单的屏幕比例适配
/*
 在最初的地方AppDelegate里面调用 [UIResponder kj_adaptModelType:KJAdaptTypeIPhone6];
 然后在需要适配的地方 替换 CGRectMake 为 KJAdaptRectMake
 view.frame = CGRectMake(0, 0, 10, 10);
 view.frame = KJAdaptRectMake(0, 0, 10, 10);
 即可完成简单的屏幕比例适配
*/
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/// 适配类型 设计图类型
typedef NS_ENUM(NSInteger, KJAdaptModelType) {
    KJAdaptTypeIPhone4 = 0, /// 3.5英寸,320 x 480pt
    KJAdaptTypeIPhone5,     /// 4.0英寸,320 x 568pt
    KJAdaptTypeIPhone6,     /// 4.7英寸,375 x 667pt
    KJAdaptTypeIPhone6P,    /// 5.5英寸,414 x 736pt
    KJAdaptTypeIPhoneX,     /// 5.8英寸,375 x 812pt
    KJAdaptTypeIPhoneXR,    /// 6.1英寸,414 x 896pt
    KJAdaptTypeIPhoneXSMax, /// 6.5英寸,414 x 896pt
//    KJAdaptTypeIPhone12Mini,/// 5.4英寸,
//    KJAdaptTypeIPhone12ProMax,/// 6.7英寸,
};
@protocol KJResponderAdaptProtocol <NSObject>
/// 设计图机型,只需要在最初的地方调用一次即可
+ (void)kj_adaptModelType:(KJAdaptModelType)type;
@end
@interface UIResponder (KJAdapt)<KJResponderAdaptProtocol>
/// 水平比例适配
CGFloat KJAdaptScaleLevel(CGFloat level);
/// 竖直比例适配,取值为水平比例适配
CGFloat KJAdaptScaleVertical(CGFloat vertical);
/// 适配CGpoint
CGPoint KJAdaptPointMake(CGFloat x, CGFloat y);
/// 适配CGSize
CGSize KJAdaptSizeMake(CGFloat width, CGFloat height);
/// 适配CGRect
CGRect KJAdaptRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height);
/// 适配UIEdgeInsets
UIEdgeInsets KJAdaptEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right);
@end
NS_ASSUME_NONNULL_END
#import "UIResponder+KJAdapt.h"
@implementation UIResponder (KJAdapt)
+ (KJAdaptModelType)adaptType{
    return (KJAdaptModelType)[objc_getAssociatedObject(self, @selector(adaptType)) intValue];
}
+ (void)setAdaptType:(KJAdaptModelType)adaptType{
    objc_setAssociatedObject(self, @selector(adaptType), @(adaptType), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (void)kj_adaptModelType:(KJAdaptModelType)type{
    self.adaptType = type;
}
CGFloat KJAdaptScaleLevel(CGFloat level){
    if (level == 0) return 0.0;
    CGFloat width;
    switch (UIResponder.adaptType) {
        case KJAdaptTypeIPhone4:width = 320;break;
        case KJAdaptTypeIPhone5:width = 320;break;
        case KJAdaptTypeIPhone6:width = 375;break;
        case KJAdaptTypeIPhone6P:width = 414;break;
        case KJAdaptTypeIPhoneX:width = 375;break;
        case KJAdaptTypeIPhoneXR:width = 414;break;
        case KJAdaptTypeIPhoneXSMax:width = 414;break;
        default:break;
    }
    return level*([[UIScreen mainScreen]bounds].size.width/width);
}
CGFloat KJAdaptScaleVertical(CGFloat vertical){
    return KJAdaptScaleLevel(vertical);
}
CGPoint KJAdaptPointMake(CGFloat x, CGFloat y){
    return CGPointMake(KJAdaptScaleLevel(x), KJAdaptScaleVertical(y));
}
CGSize KJAdaptSizeMake(CGFloat width, CGFloat height){
    return CGSizeMake(KJAdaptScaleLevel(width), KJAdaptScaleVertical(height));
}
CGRect KJAdaptRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height){
    return CGRectMake(KJAdaptScaleLevel(x), KJAdaptScaleVertical(y), KJAdaptScaleLevel(width), KJAdaptScaleVertical(height));
}
UIEdgeInsets KJAdaptEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right){
    return UIEdgeInsetsMake(KJAdaptScaleVertical(top), KJAdaptScaleLevel(left), KJAdaptScaleVertical(bottom), KJAdaptScaleLevel(right));
}
@end


备注:本文用到的部分函数方法和Demo,均来自三方库**KJEmitterView**,如有需要的朋友可自行pod 'KJEmitterView'引入即可


简单快捷的使用屏幕适配,快速按照设计图尺寸布局介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个**小星星**传送门

相关文章
|
4月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
3月前
|
BI Linux 数据安全/隐私保护
忘了 iOS(iPad、IPhone) 设备上的「屏幕使用时间」密码怎么办?找回屏幕密码
忘了 iOS(iPad、IPhone) 设备上的「屏幕使用时间」密码怎么办?找回屏幕密码
115 0
|
6月前
|
iOS开发
SwiftUI适配iOS16导航控制器引起的闪退
SwiftUI适配iOS16导航控制器引起的闪退
74 0
|
6月前
|
iOS开发
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
793 0
|
6月前
|
监控 iOS开发
iOS15适配问题:viewForSupplementaryElementOfKind表头和表尾复用闪退,UITableView section header多22像素等问题
iOS15适配问题:viewForSupplementaryElementOfKind表头和表尾复用闪退,UITableView section header多22像素等问题
98 0
|
小程序 开发工具 Android开发
Donut多端框架小程序打包适配ios和安卓app
腾讯新出了一个 Donut 多端框架,可以直接将微信小程序转成 ios 和 安卓 app,小程序开发者工具里也集成了 app 相关升级、调试和打包的功能,终于可以一套代码开发出3个客户端了!
258 0
Donut多端框架小程序打包适配ios和安卓app
|
安全 前端开发 开发工具
iOS12、iOS11、iOS10、iOS9常见适配
iOS12、iOS11、iOS10、iOS9常见适配
237 0
|
小程序 iOS开发
uniapp中IOS端小程序底部黑线适配的方法(整理)
uniapp中IOS端小程序底部黑线适配的方法(整理)
|
开发工具 iOS开发 开发者
iOS 暗黑模式的适配总结
iOS 暗黑模式的适配总结
|
安全 vr&ar 数据安全/隐私保护
iOS移动设备屏幕镜像电脑软件AirServer2023
AIrServer是一款ios投屏到mac的专用软件,可将iOS上的音频,视频,照片,幻灯片和镜像接收通过AIrPlay投射到Mac。AIrserver 7 mac版可以实现将手机上的媒体文件以及其他操作投射到电脑上进行操作。使用AIrServer,您现在可以从Mac,iOS,PC,
209 0